Module: Kernel
- Defined in:
- opal/stdlib/pp.rb,
opal/stdlib/await.rb,
opal/stdlib/native.rb,
opal/stdlib/open-uri.rb,
opal/stdlib/pathname.rb,
opal/stdlib/bigdecimal.rb,
opal/stdlib/opal-parser.rb,
opal/stdlib/nodejs/kernel.rb,
opal/stdlib/nodejs/require.rb
Class Method Summary collapse
-
.open(name, *rest, &block) ⇒ Object
Allows the opening of various resources including URIs.
-
.open_uri_original_open ⇒ Object
:nodoc:.
-
.pp(*objs) ⇒ Object
prints arguments in pretty form.
Instance Method Summary collapse
- #__prepare_require__(path) ⇒ Object
- #_Array ⇒ Object
- #`(cmdline) ⇒ Object
-
#Array(object, *args, &block) ⇒ Object
Wraps array-like JavaScript objects in Native::Array.
- #BigDecimal(initial, digits = 0) ⇒ Object
- #eval(str, binding = nil, file = nil, line = nil) ⇒ Object
-
#exit(status = true) ⇒ Object
Overwrite Kernel.exit to be async-capable.
- #load(path) ⇒ Object
-
#Native(obj) ⇒ Native::Object, ...
Wraps a native JavaScript with
Native::Object.new
. - #native?(value) ⇒ Boolean
- #Pathname(path) ⇒ Object
-
#pretty_inspect ⇒ Object
Returns a pretty printed object as a string.
- #require(path) ⇒ Object
- #require_remote(url) ⇒ Object
- #sleep(seconds) ⇒ Object
- #system(*argv, exception: false) ⇒ Object
Class Method Details
.open(name, *rest, &block) ⇒ Object
Allows the opening of various resources including URIs.
If the first argument responds to the 'open' method, 'open' is called on it with the rest of the arguments.
If the first argument is a string that begins with xxx://, it is parsed by URI.parse. If the parsed object responds to the 'open' method, 'open' is called on it with the rest of the arguments.
Otherwise, the original Kernel#open is called.
OpenURI::OpenRead#open provides URI::HTTP#open, URI::HTTPS#open and URI::FTP#open, Kernel#open.
We can accept URIs and strings that begin with http://, https:// and ftp://. In these cases, the opened file object is extended by OpenURI::Meta.
29 30 31 32 33 34 35 |
# File 'opal/stdlib/open-uri.rb', line 29 def open(name, *rest, &block) # :doc: if name.respond_to?(:to_str) && %r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ name OpenURI.open_uri(name, *rest, &block) else open_uri_original_open(name, *rest, &block) end end |
.open_uri_original_open ⇒ Object
:nodoc:
10 |
# File 'opal/stdlib/open-uri.rb', line 10 alias open_uri_original_open open |
Instance Method Details
#__prepare_require__(path) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'opal/stdlib/nodejs/require.rb', line 4 def __prepare_require__(path) name = `Opal.normalize(#{path})` full_path = name.end_with?('.rb') ? name : name + '.rb' if `!Opal.modules[#{name}]` ruby = File.read(full_path) compiler = Opal::Compiler.new(ruby, requirable: true, file: name) js = compiler.compile compiler.requires.each do |sub_path| __prepare_require__(sub_path) end `eval(#{js})` end name rescue => e raise [path, name, full_path].inspect + e. end |
#`(cmdline) ⇒ Object
31 32 33 |
# File 'opal/stdlib/nodejs/kernel.rb', line 31 def `(cmdline) Buffer.new(`__child_process__.execSync(#{cmdline})`).to_s.encode('UTF-8') end |
#Array(object, *args, &block) ⇒ Object
Wraps array-like JavaScript objects in Native::Array
245 246 247 248 249 250 |
# File 'opal/stdlib/native.rb', line 245 def Array(object, *args, &block) if native?(object) return Native::Array.new(object, *args, &block).to_a end _Array(object) end |
#BigDecimal(initial, digits = 0) ⇒ Object
7 8 9 10 11 |
# File 'opal/stdlib/bigdecimal.rb', line 7 def BigDecimal(initial, digits = 0) bigdecimal = BigDecimal.allocate bigdecimal.initialize(initial, digits) bigdecimal end |
#eval(str, binding = nil, file = nil, line = nil) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'opal/stdlib/opal-parser.rb', line 9 def eval(str, binding = nil, file = nil, line = nil) str = ::Opal.coerce_to!(str, String, :to_str) = { file: file || '(eval)', eval: true } = __OPAL_COMPILER_CONFIG__.merge() code = `Opal.compile(str, compiling_options)` if binding binding.js_eval(code) else %x{ return (function(self) { return eval(#{code}); })(self) } end end |
#exit(status = true) ⇒ Object
Overwrite Kernel.exit to be async-capable.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'opal/stdlib/await.rb', line 39 def exit(status = true) $__at_exit__ ||= [] until $__at_exit__.empty? block = $__at_exit__.pop block.call.await end %x{ if (status.$$is_boolean) { status = status ? 0 : 1; } else { status = $coerce_to(status, #{Integer}, 'to_int') } Opal.exit(status); } nil end |
#load(path) ⇒ Object
27 28 29 |
# File 'opal/stdlib/nodejs/require.rb', line 27 def load(path) `Opal.load(#{__prepare_require__(path)})` end |
#Native(obj) ⇒ Native::Object, ...
Wraps a native JavaScript with Native::Object.new
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
# File 'opal/stdlib/native.rb', line 224 def Native(obj) if `#{obj} == null` nil elsif native?(obj) Native::Object.new(obj) elsif obj.is_a?(Array) obj.map do |o| Native(o) end elsif obj.is_a?(Proc) proc do |*args, &block| Native(obj.call(*args, &block)) end else obj end end |
#native?(value) ⇒ Boolean
215 216 217 |
# File 'opal/stdlib/native.rb', line 215 def native?(value) `value == null || !value.$$class` end |
#Pathname(path) ⇒ Object
222 223 224 |
# File 'opal/stdlib/pathname.rb', line 222 def Pathname(path) Pathname.new(path) end |
#pretty_inspect ⇒ Object
Returns a pretty printed object as a string.
In order to use this method you must first require the PP module:
require 'pp'
See the PP module for more information.
602 603 604 |
# File 'opal/stdlib/pp.rb', line 602 def pretty_inspect PP.pp(self, StringIO.new).string end |
#require(path) ⇒ Object
23 24 25 |
# File 'opal/stdlib/nodejs/require.rb', line 23 def require(path) `Opal.require(#{__prepare_require__(path)})` end |
#require_remote(url) ⇒ Object
25 26 27 28 29 30 31 32 |
# File 'opal/stdlib/opal-parser.rb', line 25 def require_remote(url) %x{ var r = new XMLHttpRequest(); r.open("GET", url, false); r.send(''); } eval `r.responseText` end |
#sleep(seconds) ⇒ Object
59 60 61 62 63 |
# File 'opal/stdlib/await.rb', line 59 def sleep(seconds) prom = PromiseV2.new `setTimeout(#{proc { prom.resolve }}, #{seconds * 1000})` prom end |
#system(*argv, exception: false) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'opal/stdlib/nodejs/kernel.rb', line 8 def system(*argv, exception: false) env = {} env = argv.shift if argv.first.is_a? Hash env = ENV.merge(env).to_n cmdname = argv.shift out = if argv.empty? `__child_process__.spawnSync(#{cmdname}, { shell: true, stdio: 'inherit', env: #{env} })` elsif Array === cmdname `__child_process__.spawnSync(#{cmdname[0]}, #{argv}, { argv0: #{cmdname[1]}, stdio: 'inherit', env: #{env} })` else `__child_process__.spawnSync(#{cmdname}, #{argv}, { stdio: 'inherit', env: #{env} })` end status = out.JS[:status] status = 127 if `status === null` pid = out.JS[:pid] $? = Process::Status.new(status, pid) raise "Command failed with exit #{status}: #{cmdname}" if exception && status != 0 status == 0 end |