therubyracer 0.12.2 → 0.12.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e8d7f04f47f47686f4e67c48322d4941180096f0
4
- data.tar.gz: 6b8d2a931ab2ee60b007019224cd93ac412fa682
3
+ metadata.gz: 69a67dcb308f06dbcf18c9c74964825bc7d62e8e
4
+ data.tar.gz: cc8c5f44699f24ef1a7c7ea6d181586e737387f9
5
5
  SHA512:
6
- metadata.gz: 6eb44843a10260b65857e65fc396fc4d8acce641d87c848aa34d0726adf6a3b2f271e49e3290fa16b37ceb8a9e2ee1b72d3f4f4fb4704bd8adf16fb03d484b03
7
- data.tar.gz: 143cdbad4d72d27501f00ecbc57b569cfdc1f11a381ccd69e87089b364059bb56578d63237f437124db88adc53124fd0fe53805fa3452dcdf219e92a55b55a35
6
+ metadata.gz: 90ad98c6cb9117c3ae6daa4a15cc6e2e555a2bcdddbd9d613af946ff9005d2e804db29d775409c8b48e683f06398b61e913dacf1da98442590e247dc70665775
7
+ data.tar.gz: 40c0dd4cad9db4e215074f5a3d8bc8b9e8fefd2517b2b246abc8ce70e0d0866d2ed5e9a9e1b485fdaa45556068fb104b07fbc8f5e847c7ec425df64d9a6101ec
@@ -1,14 +1,11 @@
1
1
  cache: bundler
2
2
  rvm:
3
- - 2.1.0
4
- - 2.0.0
5
- - 1.9.3
6
- - 1.9.2
7
- - 1.8.7
8
- - rbx-2.2.3
3
+ - 2.4.0
4
+ - 2.3.3
5
+ - 2.2
9
6
  notifications:
10
7
  recipients:
11
8
  - cowboyd@thefrontside.net
12
9
  before_install:
13
- - gem update --system 2.1.11
10
+ - gem update --system
14
11
  script: bundle exec rake compile spec
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ * Support for unified Integer class in Ruby 2.4+ (thanks to @koic)
6
+
3
7
  ## 0.12.2 2015/04/06
4
8
 
5
9
  * fix memory leak where weak hash map entries were not being cleaned
data/Gemfile CHANGED
@@ -2,10 +2,11 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem "rubysl", :platforms => :rbx
6
- gem 'redjs', :git => 'https://github.com/cowboyd/redjs.git'
7
- gem "rake"
8
- gem "rspec", "~> 2.0"
9
- gem "rake-compiler"
10
- gem "gem-compiler", :platforms => :mri
11
-
5
+ group :development do
6
+ gem "rubysl", :platforms => :rbx
7
+ gem 'redjs', :git => 'https://github.com/cowboyd/redjs.git'
8
+ gem "rake"
9
+ gem "rspec", "~> 3.5.0"
10
+ gem "rake-compiler"
11
+ gem "gem-compiler", :platforms => :mri
12
+ end
data/README.md CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/therubyracer.png)](http://badge.fury.io/rb/therubyracer)
4
4
  [![Build Status](https://travis-ci.org/cowboyd/therubyracer.png?branch=master)](https://travis-ci.org/cowboyd/therubyracer)
5
+ [![Build status](https://ci.appveyor.com/api/projects/status/aqw06doke164dca7?svg=true)](https://ci.appveyor.com/project/cowboyd/therubyracer)
5
6
  [![Dependency Status](https://gemnasium.com/cowboyd/therubyracer.png)](https://gemnasium.com/cowboyd/therubyracer)
7
+ [![Join the chat at https://gitter.im/cowboyd/therubyracer](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cowboyd/therubyracer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
6
8
 
7
9
 
8
10
  * GitHub Project: [http://github.com/cowboyd/therubyracer](http://github.com/cowboyd/therubyracer)
9
11
  * Mailing List: [http://groups.google.com/group/therubyracer](http://groups.google.com/group/therubyracer)
10
- * IRC / Chat: [irc://irc.freenode.net/therubyracer](http://groups.google.com/group/therubyracer)
11
12
  * Documentation: [GitHub Wiki](https://github.com/cowboyd/therubyracer/wiki) and [RubyDoc](http://rubydoc.info/gems/therubyracer)
12
13
 
13
14
  ### DESCRIPTION
@@ -40,7 +41,7 @@ evaluate some simple JavaScript
40
41
 
41
42
  access values inside your JavaScript context from Ruby
42
43
 
43
- cxt.eval 'var val = {num: 5, fun: function isTruthy(arg) { return !!arg }}'
44
+ cxt.eval 'var val = {num: 5, isTruthy: function (arg) { return !!arg }}'
44
45
  val = cxt[:val] #=> V8::Object
45
46
  cxt[:val] == cxt.scope.val #=> true
46
47
  val.num #=> 5
@@ -16,7 +16,7 @@ if enable_config('debug')
16
16
  $CFLAGS += " -O0 -ggdb3"
17
17
  end
18
18
 
19
- LIBV8_COMPATIBILITY = '~> 3.16.14'
19
+ LIBV8_COMPATIBILITY = '~> 3.16.14.15'
20
20
 
21
21
  begin
22
22
  require 'rubygems'
data/lib/v8.rb CHANGED
@@ -18,7 +18,7 @@ require 'v8/conversion/proc'
18
18
  require 'v8/conversion/method'
19
19
  require 'v8/conversion/symbol'
20
20
  require 'v8/conversion/string'
21
- require 'v8/conversion/fixnum'
21
+ require 'v8/conversion/integer'
22
22
  require 'v8/conversion'
23
23
  require 'v8/access/names'
24
24
  require 'v8/access/indices'
@@ -18,7 +18,7 @@ for type in [TrueClass, FalseClass, NilClass, Float] do
18
18
  end
19
19
  end
20
20
 
21
- for type in [Class, Object, Array, Hash, String, Symbol, Time, Proc, Method, Fixnum] do
21
+ for type in [Class, Object, Array, Hash, String, Symbol, Time, Proc, Method, Integer] do
22
22
  type.class_eval do
23
23
  include V8::Conversion.const_get(type.name)
24
24
  end
@@ -1,5 +1,5 @@
1
1
  class V8::Conversion
2
- module Fixnum
2
+ module Integer
3
3
  def to_ruby
4
4
  self
5
5
  end
@@ -1,3 +1,3 @@
1
1
  module V8
2
- VERSION = "0.12.2"
2
+ VERSION = "0.12.3"
3
3
  end
@@ -1,17 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::Array do
4
+ requires_v8_context
5
+
4
6
  it "can store and retrieve a value" do
5
7
  o = V8::C::Object::New()
6
8
  a = V8::C::Array::New()
7
9
  a.Length().should eql 0
8
10
  a.Set(0, o)
9
11
  a.Length().should eql 1
10
- a.Get(0).Equals(o).should be_true
12
+ a.Get(0).Equals(o).should be_truthy
11
13
  end
12
14
 
13
15
  it "can be initialized with a length" do
14
16
  a = V8::C::Array::New(5)
15
17
  a.Length().should eql 5
16
18
  end
17
- end
19
+ end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C do
4
+ requires_v8_context
5
+
4
6
  it "has constant methods for Undefined, Null, True and False" do
5
7
  [:Undefined, :Null, :True, :False].each do |name|
6
8
  constant = V8::C.send(name)
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::Exception do
4
+ requires_v8_context
5
+
4
6
  it "can be thrown from Ruby" do
5
7
  t = V8::C::FunctionTemplate::New(method(:explode))
6
8
  @cxt.Global().Set("explode", t.GetFunction())
@@ -23,4 +25,4 @@ describe V8::C::Exception do
23
25
  error = V8::C::Exception::SyntaxError('did not pay syntax')
24
26
  V8::C::ThrowException(error)
25
27
  end
26
- end
28
+ end
@@ -1,9 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::External do
4
+ requires_v8_context
5
+
4
6
  it "can store and retrieve a value" do
5
7
  o = Object.new
6
8
  external = V8::C::External::New(o)
7
9
  external.Value().should be(o)
8
10
  end
9
- end
11
+ end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::Function do
4
+ requires_v8_context
5
+
4
6
  it "can be called" do
5
7
  fn = run '(function() {return "foo"})'
6
8
  fn.Call(@cxt.Global(), []).Utf8Value().should eql "foo"
@@ -43,4 +45,4 @@ describe V8::C::Function do
43
45
  result = script.Run()
44
46
  result.kind_of?(V8::C::String) ? result.Utf8Value() : result
45
47
  end
46
- end
48
+ end
@@ -1,18 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "setting up handles scopes" do
4
- include ExplicitScoper
5
-
6
- before do
7
- def self.instance_eval(*args, &block)
8
- V8::C::Locker() do
9
- cxt = V8::C::Context::New()
10
- begin
11
- cxt.Enter()
12
- super(*args, &block)
13
- ensure
14
- cxt.Exit()
15
- end
4
+ around(:each) do |example|
5
+ V8::C::Locker() do
6
+ cxt = V8::C::Context::New()
7
+ begin
8
+ cxt.Enter()
9
+ example.run
10
+ ensure
11
+ cxt.Exit()
16
12
  end
17
13
  end
18
14
  end
@@ -32,4 +28,4 @@ describe "setting up handles scopes" do
32
28
  e.message.should eql "boom!"
33
29
  end
34
30
  end
35
- end
31
+ end
@@ -1,17 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::Locker do
4
- include ExplicitScoper
5
-
6
4
  it "can lock and unlock the VM" do
7
- V8::C::Locker::IsLocked().should be_false
5
+ V8::C::Locker::IsLocked().should be_falsey
8
6
  V8::C::Locker() do
9
- V8::C::Locker::IsLocked().should be_true
7
+ V8::C::Locker::IsLocked().should be_truthy
10
8
  V8::C::Unlocker() do
11
- V8::C::Locker::IsLocked().should be_false
9
+ V8::C::Locker::IsLocked().should be_falsey
12
10
  end
13
11
  end
14
- V8::C::Locker::IsLocked().should be_false
12
+ V8::C::Locker::IsLocked().should be_falsey
15
13
  end
16
14
 
17
15
  it "properly unlocks if an exception is thrown inside a lock block" do
@@ -20,7 +18,7 @@ describe V8::C::Locker do
20
18
  raise "boom!"
21
19
  end
22
20
  rescue
23
- V8::C::Locker::IsLocked().should be_false
21
+ V8::C::Locker::IsLocked().should be_falsey
24
22
  end
25
23
  end
26
24
 
@@ -31,8 +29,8 @@ describe V8::C::Locker do
31
29
  raise "boom!"
32
30
  end
33
31
  rescue
34
- V8::C::Locker::IsLocked().should be_true
32
+ V8::C::Locker::IsLocked().should be_truthy
35
33
  end
36
34
  end
37
35
  end
38
- end
36
+ end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::Object do
4
+ requires_v8_context
4
5
 
5
6
  it "can store and retrieve a value" do
6
7
  o = V8::C::Object::New()
@@ -25,8 +26,8 @@ describe V8::C::Object do
25
26
  callback_data = V8::C::String::New("I am Legend")
26
27
  left = V8::C::String::New("Yo! ")
27
28
  getter = proc do |name, info|
28
- info.This().StrictEquals(o).should be_true
29
- info.Holder().StrictEquals(o).should be_true
29
+ info.This().StrictEquals(o).should be_truthy
30
+ info.Holder().StrictEquals(o).should be_truthy
30
31
  V8::C::String::Concat(left, info.Data())
31
32
  end
32
33
  setter = proc do |name, value, info|
@@ -43,4 +44,4 @@ describe V8::C::Object do
43
44
  one.Set("two", two)
44
45
  one.Get("two").should be two
45
46
  end
46
- end
47
+ end
@@ -2,6 +2,8 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe V8::C::Script do
5
+ requires_v8_context
6
+
5
7
  it "can run a script and return a polymorphic result" do
6
8
  source = V8::C::String::New("(new Array())")
7
9
  filename = V8::C::String::New("<eval>")
@@ -15,7 +17,7 @@ describe V8::C::Script do
15
17
  name = V8::C::String::New("<spec>")
16
18
  origin = V8::C::ScriptOrigin.new(name)
17
19
  data = V8::C::ScriptData::PreCompile(source, source.length)
18
- data.HasError().should be_false
20
+ data.HasError().should be_falsey
19
21
  script = V8::C::Script::New(V8::C::String::New(source), origin, data)
20
22
  script.Run().should eql 42
21
23
  end
@@ -23,6 +25,6 @@ describe V8::C::Script do
23
25
  it "can detect errors in the script data" do
24
26
  source = "^ = ;"
25
27
  data = V8::C::ScriptData::PreCompile(source, source.length)
26
- data.HasError().should be_true
28
+ data.HasError().should be_truthy
27
29
  end
28
- end
30
+ end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::String do
4
+ requires_v8_context
5
+
4
6
  it "can hold Unicode values outside the Basic Multilingual Plane" do
5
7
  string = V8::C::String::New("\u{100000}")
6
8
  string.Utf8Value().should eql "\u{100000}"
@@ -13,4 +15,4 @@ describe V8::C::String do
13
15
  it "can naturally translate ruby objects into v8 strings" do
14
16
  V8::C::String::Concat(V8::C::String::New("forty two is "), 42).Utf8Value().should eql "forty two is 42"
15
17
  end
16
- end
18
+ end
@@ -1,11 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::Template do
4
+ requires_v8_context
4
5
 
5
6
  describe V8::C::FunctionTemplate do
6
7
  it "can be created with no arguments" do
7
8
  t = V8::C::FunctionTemplate::New()
8
- t.GetFunction().Call(@cxt.Global(),[]).StrictEquals(@cxt.Global()).should be_true
9
+ t.GetFunction().Call(@cxt.Global(),[]).StrictEquals(@cxt.Global()).should be_truthy
9
10
  end
10
11
 
11
12
  it "can be created with a callback" do
@@ -15,10 +16,10 @@ describe V8::C::Template do
15
16
  arguments.Length().should be(2)
16
17
  arguments[0].Utf8Value().should eql 'one'
17
18
  arguments[1].Utf8Value().should eql 'two'
18
- arguments.Callee().StrictEquals(f).should be_true
19
- arguments.This().StrictEquals(receiver).should be_true
20
- arguments.Holder().StrictEquals(receiver).should be_true
21
- arguments.IsConstructCall().should be_false
19
+ arguments.Callee().StrictEquals(f).should be_truthy
20
+ arguments.This().StrictEquals(receiver).should be_truthy
21
+ arguments.Holder().StrictEquals(receiver).should be_truthy
22
+ arguments.IsConstructCall().should be_falsey
22
23
  arguments.Data().Value().should be(42)
23
24
  V8::C::String::New("result")
24
25
  end
@@ -27,4 +28,4 @@ describe V8::C::Template do
27
28
  f.Call(receiver, [V8::C::String::New('one'), V8::C::String::New('two')]).Utf8Value().should eql "result"
28
29
  end
29
30
  end
30
- end
31
+ end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe V8::C::External do
4
+ requires_v8_context
4
5
 
5
6
  it "can catch javascript exceptions" do
6
7
  V8::C::V8::SetCaptureStackTraceForUncaughtExceptions(true, 99, V8::C::StackTrace::kDetailed)
@@ -23,11 +24,11 @@ describe V8::C::External do
23
24
  filename = V8::C::String::New("<eval>")
24
25
  script = V8::C::Script::New(source, filename)
25
26
  result = script.Run()
26
- trycatch.HasCaught().should be_true
27
- trycatch.CanContinue().should be_true
27
+ trycatch.HasCaught().should be_truthy
28
+ trycatch.CanContinue().should be_truthy
28
29
  exception = trycatch.Exception()
29
30
  exception.should_not be_nil
30
- exception.IsNativeError().should be_true
31
+ exception.IsNativeError().should be_truthy
31
32
  trycatch.StackTrace().Utf8Value().should match /boom.*three.*two.*one/m
32
33
  message = trycatch.Message();
33
34
  message.should_not be_nil
@@ -43,9 +44,9 @@ describe V8::C::External do
43
44
  frame.GetColumn().should eql 15
44
45
  frame.GetScriptName().Utf8Value().should eql "<eval>"
45
46
  frame.GetScriptNameOrSourceURL().Utf8Value().should eql "<eval>"
46
- frame.IsEval().should be_false
47
- stack.GetFrame(4).IsEval().should be_true
48
- frame.IsConstructor().should be_false
47
+ frame.IsEval().should be_falsey
48
+ stack.GetFrame(4).IsEval().should be_truthy
49
+ frame.IsConstructor().should be_falsey
49
50
  end
50
51
  end
51
- end
52
+ end
@@ -5,6 +5,6 @@ module RedJS
5
5
  Error = V8::Error
6
6
  end
7
7
  describe V8::Context do
8
- pending "not ready for prime-time"
8
+ skip "not ready for prime-time"
9
9
  #it_behaves_like 'RedJS::Context'
10
- end
10
+ end
@@ -11,35 +11,32 @@ def rputs(msg)
11
11
  $stdout.flush
12
12
  end
13
13
 
14
- module ExplicitScoper;end
15
- module Autoscope
16
- def instance_eval(*args, &block)
17
- return super unless low_level_c_spec? && !explicitly_defines_scope?
14
+ module V8ContextHelpers
15
+ module GroupMethods
16
+ def requires_v8_context
17
+ around(:each) do |example|
18
+ bootstrap_v8_context(&example)
19
+ end
20
+ end
21
+ end
22
+
23
+ def bootstrap_v8_context
18
24
  V8::C::Locker() do
19
25
  V8::C::HandleScope() do
20
26
  @cxt = V8::C::Context::New()
21
27
  begin
22
28
  @cxt.Enter()
23
- super(*args, &block)
29
+ yield
24
30
  ensure
25
31
  @cxt.Exit()
26
32
  end
27
33
  end
28
34
  end
29
35
  end
30
-
31
- def low_level_c_spec?
32
- return false unless described_class
33
- described_class.name =~ /^V8::C::/
34
- end
35
-
36
- def explicitly_defines_scope?
37
- is_a?(ExplicitScoper)
38
- end
39
36
  end
40
37
 
41
38
  RSpec.configure do |c|
42
- c.before(:each) do
43
- extend Autoscope
44
- end
45
- end
39
+ c.include V8ContextHelpers
40
+ c.extend V8ContextHelpers::GroupMethods
41
+ c.expect_with(:rspec) { |c| c.syntax = :should }
42
+ end
@@ -21,30 +21,30 @@ describe V8::Conversion do
21
21
  klass.test.should be_instance_of(::Set)
22
22
  end
23
23
 
24
- context "::Fixnum" do
24
+ context "::Integer" do
25
25
  context "for 32-bit numbers" do
26
26
  it "should convert positive integer" do
27
- cxt['fixnum_a'] = 123
28
- cxt['fixnum_a'].should == 123
29
- cxt['fixnum_a'].should be_instance_of(Fixnum)
27
+ cxt['integer_a'] = 123
28
+ cxt['integer_a'].should == 123
29
+ cxt['integer_a'].should be_kind_of(Integer)
30
30
  end
31
31
 
32
32
  it "should convert negative integer" do
33
- cxt['fixnum_b'] = -123
34
- cxt['fixnum_b'].should == -123
35
- cxt['fixnum_b'].should be_instance_of(Fixnum)
33
+ cxt['integer_b'] = -123
34
+ cxt['integer_b'].should == -123
35
+ cxt['integer_b'].should be_kind_of(Integer)
36
36
  end
37
37
  end
38
38
 
39
39
  context "for 64-bit numbers" do
40
40
  it "should convert positive integer" do
41
- cxt['fixnum_c'] = 0x100000000
42
- cxt['fixnum_c'].should == 0x100000000
41
+ cxt['integer_c'] = 0x100000000
42
+ cxt['integer_c'].should == 0x100000000
43
43
  end
44
44
 
45
45
  it "should convert negative integer" do
46
- cxt['fixnum_d'] = -0x100000000
47
- cxt['fixnum_d'].should == -0x100000000
46
+ cxt['integer_d'] = -0x100000000
47
+ cxt['integer_d'].should == -0x100000000
48
48
  end
49
49
  end
50
50
 
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  require File.expand_path('../lib/v8/version', __FILE__)
3
2
 
4
3
  Gem::Specification.new do |gem|
@@ -18,5 +17,5 @@ Gem::Specification.new do |gem|
18
17
  gem.license = 'MIT'
19
18
 
20
19
  gem.add_dependency 'ref'
21
- gem.add_dependency 'libv8', '~> 3.16.14.0'
20
+ gem.add_dependency 'libv8', '~> 3.16.14.15'
22
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: therubyracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.2
4
+ version: 0.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Lowell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-07 00:00:00.000000000 Z
11
+ date: 2017-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ref
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.16.14.0
33
+ version: 3.16.14.15
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.16.14.0
40
+ version: 3.16.14.15
41
41
  description: Call JavaScript code and manipulate JavaScript objects from Ruby. Call
42
42
  Ruby code and manipulate Ruby objects from JavaScript.
43
43
  email:
@@ -96,10 +96,10 @@ files:
96
96
  - lib/v8/conversion/array.rb
97
97
  - lib/v8/conversion/class.rb
98
98
  - lib/v8/conversion/code.rb
99
- - lib/v8/conversion/fixnum.rb
100
99
  - lib/v8/conversion/fundamental.rb
101
100
  - lib/v8/conversion/hash.rb
102
101
  - lib/v8/conversion/indentity.rb
102
+ - lib/v8/conversion/integer.rb
103
103
  - lib/v8/conversion/method.rb
104
104
  - lib/v8/conversion/object.rb
105
105
  - lib/v8/conversion/primitive.rb
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  version: '0'
159
159
  requirements: []
160
160
  rubyforge_project:
161
- rubygems_version: 2.2.2
161
+ rubygems_version: 2.5.2
162
162
  signing_key:
163
163
  specification_version: 4
164
164
  summary: Embed the V8 JavaScript interpreter into Ruby