Module: Kernel

Defined in:
opal/stdlib/pp.rb,
opal/stdlib/native.rb,
opal/stdlib/open-uri.rb,
opal/stdlib/pathname.rb,
opal/stdlib/opal-parser.rb,
opal/stdlib/nodejs/kernel.rb,
opal/stdlib/nodejs/require.rb,
opal/stdlib/bigdecimal/kernel.rb

Constant Summary

NODE_REQUIRE =
`require`

Class Method Summary collapse

Instance Method Summary collapse

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_openObject

:nodoc:


10
# File 'opal/stdlib/open-uri.rb', line 10

alias open_uri_original_open open

.pp(*objs) ⇒ Object


6
7
8
9
10
11
# File 'opal/stdlib/pp.rb', line 6

def pp(*objs)
  objs.each do |obj|
    PP.pp(obj)
  end
  objs.size <= 1 ? objs.first : objs
end

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.message
end

#_ArrayObject


242
# File 'opal/stdlib/native.rb', line 242

alias _Array Array

#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


2
3
4
# File 'opal/stdlib/bigdecimal/kernel.rb', line 2

def BigDecimal(initial, digits = 0)
  BigDecimal.new(initial, digits)
end

#caller(*args) ⇒ Object


6
7
8
9
10
11
12
13
14
15
16
17
# File 'opal/stdlib/nodejs/kernel.rb', line 6

def caller(*args)
  %x{
    var stack;
    try {
      var err = Error("my error");
      throw err;
    } catch(e) {
      stack = e.stack;
    }
    return stack.$split("\n").slice(3);
  }
end

#eval(str) ⇒ Object


9
10
11
12
13
14
15
16
17
18
19
# File 'opal/stdlib/opal-parser.rb', line 9

def eval(str)
  str = Opal.coerce_to!(str, String, :to_str)
  default_eval_options = { file: '(eval)', eval: true }
  compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
  code = Opal.compile str, compiling_options
  %x{
    return (function(self) {
      return eval(#{code});
    })(self)
  }
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

Returns:

  • (Native::Object)

    The wrapped object if it is native

  • (nil)

    for null and undefined

  • (obj)

    The object itself if it's not native


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

Returns:


215
216
217
# File 'opal/stdlib/native.rb', line 215

def native?(value)
  `value == null || !value.$$class`
end

#node_require(path) ⇒ Object

Deprecated.

Please use require('module') instead


20
21
22
23
# File 'opal/stdlib/nodejs/kernel.rb', line 20

def node_require(path)
  warn '[DEPRECATION] node_require is deprecated. Please use `require(\'module\')` instead.'
  `#{NODE_REQUIRE}(#{path.to_str})`
end

#Pathname(path) ⇒ Object


219
220
221
# File 'opal/stdlib/pathname.rb', line 219

def Pathname(path)
  Pathname.new(path)
end

#pretty_inspectObject


2
3
4
# File 'opal/stdlib/pp.rb', line 2

def pretty_inspect
  inspect
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


21
22
23
24
25
26
27
28
# File 'opal/stdlib/opal-parser.rb', line 21

def require_remote(url)
  %x{
    var r = new XMLHttpRequest();
    r.open("GET", url, false);
    r.send('');
  }
  eval `r.responseText`
end