mini_racer 0.2.5 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33363eb77714da62e0920f19b096785488a5f425866918e1942a8062cb5fe233
4
- data.tar.gz: 1aba90413863460047822b072d92c261f6bc5927918409cf19f8f36ecf97d5e6
3
+ metadata.gz: a50c6aea93635efc351ce95def252df6edb3fbede6a0372272f8c9cd58f9aaed
4
+ data.tar.gz: b01cd6a98eca13db18d539ed259e4acd968eb073582979ff06f78a5df54a4207
5
5
  SHA512:
6
- metadata.gz: 1d9acc921de43092d13c1edfc37a2fd753b0d572b2979d38185b0ea76b4527092d9569329479df8a21561589fe57acbcc6db8087948914bed2dde7178c9cfa2a
7
- data.tar.gz: 537161ead4afdb14675b4593eea7f0e714d424c8a31bb2fc32960d3c8500a495b3d98f76280018df7a2d6072cdc8d038d791908b63ccd571e0c5757bb3ebc698
6
+ metadata.gz: cac0258ac9f1f93245b00b313d004504d770e9dce3eb5ac9a8d547a1b24cd3649ec9039d9c7429ff7871f9f8d3c07e260997d86647905ba433688f361bd72611
7
+ data.tar.gz: b054a38013e7bcffe689c3732d7d95abbaf61c350dab275ff7e04e667bc5f15ae9863a706beb2848681b8d69cc1194c0bb87014a4c49e2f49d14a4289b1f6436
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3
4
3
  - 2.4
5
4
  - 2.5
5
+ - 2.6
6
+ - 2.7
6
7
  - ruby-head
7
8
  matrix:
8
9
  include:
data/CHANGELOG CHANGED
@@ -1,3 +1,33 @@
1
+ - 0.2.10
2
+
3
+ - 22-04-2020
4
+
5
+ - FEATURE: memory softlimit support for nogvl_context_call
6
+
7
+ - 0.2.9
8
+
9
+ - 09-01-2020
10
+
11
+ - FIX: correct segfault when JS returns a Symbol and properly cast to ruby symbol
12
+
13
+ - 0.2.8
14
+
15
+ - 11-11-2019
16
+
17
+ - FIX: ensure thread live cycle is properly accounter for following file descriptor fix
18
+
19
+ - 0.2.7
20
+
21
+ - 11-11-2019
22
+
23
+ - FIX: release the file descriptor for timeout pipe earlier (this avoids holding too many files open in Ruby 2.7)
24
+
25
+ - 14-05-2019
26
+
27
+ - 0.2.6
28
+
29
+ - FEATURE: add support for write_heap_snapshot which helps you analyze memory
30
+
1
31
  - 25-04-2019
2
32
 
3
33
  - 0.2.5
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # MiniRacer
2
2
 
3
- [![Build Status](https://travis-ci.org/discourse/mini_racer.svg?branch=master)](https://travis-ci.org/discourse/mini_racer)
3
+ [![Build Status](https://travis-ci.org/rubyjs/mini_racer.svg?branch=master)](https://travis-ci.org/rubyjs/mini_racer)
4
4
 
5
5
  Minimal, modern embedded V8 for Ruby.
6
6
 
@@ -97,6 +97,27 @@ context.eval('bar()', filename: 'a/bar.js')
97
97
 
98
98
  ```
99
99
 
100
+ ### Fork safety
101
+
102
+ Some Ruby web servers employ forking (for example unicorn or puma in clustered mode). V8 is not fork safe.
103
+ Sadly Ruby does not have support for fork notifications per [#5446](https://bugs.ruby-lang.org/issues/5446).
104
+
105
+ If you want to ensure your application does not leak memory after fork either:
106
+
107
+ 1. Ensure no MiniRacer::Context objects are created in the master process
108
+
109
+ Or
110
+
111
+ 2. Dispose manually of all MiniRacer::Context objects prior to forking
112
+
113
+ ```ruby
114
+ # before fork
115
+
116
+ require 'objspace'
117
+ ObjectSpace.each_object(MiniRacer::Context){|c| c.dispose}
118
+
119
+ # fork here
120
+ ```
100
121
 
101
122
  ### Threadsafe
102
123
 
@@ -252,7 +273,7 @@ context.eval js
252
273
  The same code without the harmony runtime flag results in a `MiniRacer::RuntimeError: RangeError: Maximum call stack size exceeded` exception.
253
274
  Please refer to http://node.green/ as a reference on other harmony features.
254
275
 
255
- A list of all V8 runtime flags can be found using `node --v8-options`, or else by perusing [the V8 source code for flags (make sure to use the right version of V8)](https://github.com/v8/v8/blob/master/src/flag-definitions.h).
276
+ A list of all V8 runtime flags can be found using `node --v8-options`, or else by perusing [the V8 source code for flags (make sure to use the right version of V8)](https://github.com/v8/v8/blob/master/src/flags/flag-definitions.h).
256
277
 
257
278
  Note that runtime flags must be set before any other operation (e.g. creating a context, a snapshot or an isolate), otherwise an exception will be thrown.
258
279
 
@@ -426,7 +447,7 @@ Add this to your .travis.yml file:
426
447
 
427
448
  ## Contributing
428
449
 
429
- Bug reports and pull requests are welcome on GitHub at https://github.com/discourse/mini_racer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
450
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rubyjs/mini_racer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
430
451
 
431
452
 
432
453
  ## License
data/Rakefile CHANGED
@@ -16,6 +16,22 @@ Rake::ExtensionTask.new( 'mini_racer_extension', gem )
16
16
 
17
17
  # via http://blog.flavorjon.es/2009/06/easily-valgrind-gdb-your-ruby-c.html
18
18
  namespace :test do
19
+ desc "run test suite with Address Sanitizer"
20
+ task :asan do
21
+ ENV["CONFIGURE_ARGS"] = [ENV["CONFIGURE_ARGS"], '--enable-asan'].compact.join(' ')
22
+ Rake::Task['compile'].invoke
23
+
24
+ asan_path = `ldconfig -N -p |grep libasan | grep -v 32 | sed 's/.* => \\(.*\\)$/\\1/'`.chomp.split("\n")[-1]
25
+
26
+
27
+ cmdline = "env LD_PRELOAD=\"#{asan_path}\" ruby test/test_leak.rb"
28
+ puts cmdline
29
+ system cmdline
30
+
31
+ cmdline = "env LD_PRELOAD=\"#{asan_path}\" rake test"
32
+ puts cmdline
33
+ system cmdline
34
+ end
19
35
  # partial-loads-ok and undef-value-errors necessary to ignore
20
36
  # spurious (and eminently ignorable) warnings from the ruby
21
37
  # interpreter
@@ -52,3 +68,28 @@ namespace :test do
52
68
  end
53
69
  end
54
70
  end
71
+
72
+ desc 'run clang-tidy linter on mini_racer_extension.cc'
73
+ task :lint do
74
+ require 'mkmf'
75
+ require 'libv8'
76
+
77
+ Libv8.configure_makefile
78
+
79
+ conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote,
80
+ 'arch_hdrdir' => $arch_hdrdir.quote,
81
+ 'top_srcdir' => $top_srcdir.quote)
82
+ if $universal and (arch_flag = conf['ARCH_FLAG']) and !arch_flag.empty?
83
+ conf['ARCH_FLAG'] = arch_flag.gsub(/(?:\G|\s)-arch\s+\S+/, '')
84
+ end
85
+
86
+ checks = %W(bugprone-*
87
+ cert-*
88
+ cppcoreguidelines-*
89
+ clang-analyzer-*
90
+ performance-*
91
+ portability-*
92
+ readability-*).join(',')
93
+
94
+ sh RbConfig::expand("clang-tidy -checks='#{checks}' ext/mini_racer_extension/mini_racer_extension.cc -- #$INCFLAGS #$CPPFLAGS", conf)
95
+ end
@@ -49,10 +49,15 @@ if CONFIG['warnflags']
49
49
  CONFIG['warnflags'].gsub!('-Wimplicit-function-declaration', '')
50
50
  end
51
51
 
52
- if enable_config('debug')
52
+ if enable_config('debug') || enable_config('asan')
53
53
  CONFIG['debugflags'] << ' -ggdb3 -O0'
54
54
  end
55
55
 
56
56
  Libv8.configure_makefile
57
57
 
58
+ if enable_config('asan')
59
+ $CPPFLAGS.insert(0, " -fsanitize=address ")
60
+ $LDFLAGS.insert(0, " -fsanitize=address ")
61
+ end
62
+
58
63
  create_makefile 'mini_racer_extension'
@@ -1,7 +1,9 @@
1
1
  #include <stdio.h>
2
2
  #include <ruby.h>
3
3
  #include <ruby/thread.h>
4
+ #include <ruby/io.h>
4
5
  #include <v8.h>
6
+ #include <v8-profiler.h>
5
7
  #include <libplatform/libplatform.h>
6
8
  #include <ruby/encoding.h>
7
9
  #include <pthread.h>
@@ -125,6 +127,7 @@ typedef struct {
125
127
  Local<Function> fun;
126
128
  Local<Value> *argv;
127
129
  EvalResult result;
130
+ size_t max_memory;
128
131
  } FunctionCall;
129
132
 
130
133
  enum IsolateFlags {
@@ -150,7 +153,7 @@ static VALUE rb_mJSON;
150
153
  static VALUE rb_cFailedV8Conversion;
151
154
  static VALUE rb_cDateTime = Qnil;
152
155
 
153
- static Platform* current_platform = NULL;
156
+ static std::unique_ptr<Platform> current_platform = NULL;
154
157
  static std::mutex platform_lock;
155
158
 
156
159
  static VALUE rb_platform_set_flag_as_str(VALUE _klass, VALUE flag_as_str) {
@@ -187,8 +190,8 @@ static void init_v8() {
187
190
 
188
191
  if (current_platform == NULL) {
189
192
  V8::InitializeICU();
190
- current_platform = platform::CreateDefaultPlatform();
191
- V8::InitializePlatform(current_platform);
193
+ current_platform = platform::NewDefaultPlatform();
194
+ V8::InitializePlatform(current_platform.get());
192
195
  V8::Initialize();
193
196
  }
194
197
 
@@ -239,7 +242,7 @@ static void prepare_result(MaybeLocal v8res,
239
242
  Local<Object> object = local_value->ToObject(context).ToLocalChecked();
240
243
  const unsigned argc = 1;
241
244
  Local<Value> argv[argc] = { object };
242
- MaybeLocal<Value> json = stringify->Call(JSON, argc, argv);
245
+ MaybeLocal<Value> json = stringify->Call(context, JSON, argc, argv);
243
246
 
244
247
  if (json.IsEmpty()) {
245
248
  evalRes.executed = false;
@@ -442,8 +445,27 @@ static VALUE convert_v8_to_ruby(Isolate* isolate, Local context,
442
445
  return rb_hash;
443
446
  }
444
447
 
445
- Local<String> rstr = value->ToString(context).ToLocalChecked();
446
- return rb_enc_str_new(*String::Utf8Value(isolate, rstr), rstr->Utf8Length(isolate), rb_enc_find("utf-8"));
448
+ if (value->IsSymbol()) {
449
+ v8::String::Utf8Value symbol_name(isolate,
450
+ Local<Symbol>::Cast(value)->Name());
451
+
452
+ VALUE str_symbol = rb_enc_str_new(
453
+ *symbol_name,
454
+ symbol_name.length(),
455
+ rb_enc_find("utf-8")
456
+ );
457
+
458
+ return ID2SYM(rb_intern_str(str_symbol));
459
+ }
460
+
461
+ MaybeLocal<String> rstr_maybe = value->ToString(context);
462
+
463
+ if (rstr_maybe.IsEmpty()) {
464
+ return Qnil;
465
+ } else {
466
+ Local<String> rstr = rstr_maybe.ToLocalChecked();
467
+ return rb_enc_str_new(*String::Utf8Value(isolate, rstr), rstr->Utf8Length(isolate), rb_enc_find("utf-8"));
468
+ }
447
469
  }
448
470
 
449
471
  static VALUE convert_v8_to_ruby(Isolate* isolate,
@@ -1084,8 +1106,10 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
1084
1106
  Local<Context> context = context_info->context->Get(isolate);
1085
1107
  Context::Scope context_scope(context);
1086
1108
 
1087
- Local<String> v8_str = String::NewFromUtf8(isolate, RSTRING_PTR(name),
1088
- NewStringType::kNormal, (int)RSTRING_LEN(name)).ToLocalChecked();
1109
+ Local<String> v8_str =
1110
+ String::NewFromUtf8(isolate, RSTRING_PTR(name),
1111
+ NewStringType::kNormal, (int)RSTRING_LEN(name))
1112
+ .ToLocalChecked();
1089
1113
 
1090
1114
  // copy self so we can access from v8 external
1091
1115
  VALUE* self_copy;
@@ -1095,24 +1119,35 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
1095
1119
  Local<Value> external = External::New(isolate, self_copy);
1096
1120
 
1097
1121
  if (parent_object == Qnil) {
1098
- context->Global()->Set(v8_str, FunctionTemplate::New(isolate, ruby_callback, external)->GetFunction());
1099
- } else {
1122
+ context->Global()->Set(
1123
+ v8_str, FunctionTemplate::New(isolate, ruby_callback, external)
1124
+ ->GetFunction(context)
1125
+ .ToLocalChecked());
1100
1126
 
1101
- Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval),
1102
- NewStringType::kNormal, (int)RSTRING_LEN(parent_object_eval)).ToLocalChecked();
1127
+ } else {
1128
+ Local<String> eval =
1129
+ String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval),
1130
+ NewStringType::kNormal,
1131
+ (int)RSTRING_LEN(parent_object_eval))
1132
+ .ToLocalChecked();
1103
1133
 
1104
1134
  MaybeLocal<Script> parsed_script = Script::Compile(context, eval);
1105
1135
  if (parsed_script.IsEmpty()) {
1106
- parse_error = true;
1136
+ parse_error = true;
1107
1137
  } else {
1108
- MaybeLocal<Value> maybe_value = parsed_script.ToLocalChecked()->Run(context);
1138
+ MaybeLocal<Value> maybe_value =
1139
+ parsed_script.ToLocalChecked()->Run(context);
1109
1140
  attach_error = true;
1110
1141
 
1111
1142
  if (!maybe_value.IsEmpty()) {
1112
1143
  Local<Value> value = maybe_value.ToLocalChecked();
1113
- if (value->IsObject()){
1114
- value.As<Object>()->Set(v8_str, FunctionTemplate::New(isolate, ruby_callback, external)->GetFunction());
1115
- attach_error = false;
1144
+ if (value->IsObject()) {
1145
+ value.As<Object>()->Set(
1146
+ v8_str, FunctionTemplate::New(
1147
+ isolate, ruby_callback, external)
1148
+ ->GetFunction(context)
1149
+ .ToLocalChecked());
1150
+ attach_error = false;
1116
1151
  }
1117
1152
  }
1118
1153
  }
@@ -1315,6 +1350,69 @@ rb_heap_stats(VALUE self) {
1315
1350
  return rval;
1316
1351
  }
1317
1352
 
1353
+ // https://github.com/bnoordhuis/node-heapdump/blob/master/src/heapdump.cc
1354
+ class FileOutputStream : public OutputStream {
1355
+ public:
1356
+ FileOutputStream(FILE* stream) : stream_(stream) {}
1357
+
1358
+ virtual int GetChunkSize() {
1359
+ return 65536;
1360
+ }
1361
+
1362
+ virtual void EndOfStream() {}
1363
+
1364
+ virtual WriteResult WriteAsciiChunk(char* data, int size) {
1365
+ const size_t len = static_cast<size_t>(size);
1366
+ size_t off = 0;
1367
+
1368
+ while (off < len && !feof(stream_) && !ferror(stream_))
1369
+ off += fwrite(data + off, 1, len - off, stream_);
1370
+
1371
+ return off == len ? kContinue : kAbort;
1372
+ }
1373
+
1374
+ private:
1375
+ FILE* stream_;
1376
+ };
1377
+
1378
+
1379
+ static VALUE
1380
+ rb_heap_snapshot(VALUE self, VALUE file) {
1381
+
1382
+ rb_io_t *fptr;
1383
+
1384
+ fptr = RFILE(file)->fptr;
1385
+
1386
+ if (!fptr) return Qfalse;
1387
+
1388
+ FILE* fp;
1389
+ fp = fdopen(fptr->fd, "w");
1390
+ if (fp == NULL) return Qfalse;
1391
+
1392
+
1393
+ ContextInfo* context_info;
1394
+ Data_Get_Struct(self, ContextInfo, context_info);
1395
+ Isolate* isolate;
1396
+ isolate = context_info->isolate_info ? context_info->isolate_info->isolate : NULL;
1397
+
1398
+ if (!isolate) return Qfalse;
1399
+
1400
+ Locker lock(isolate);
1401
+ Isolate::Scope isolate_scope(isolate);
1402
+ HandleScope handle_scope(isolate);
1403
+
1404
+ HeapProfiler* heap_profiler = isolate->GetHeapProfiler();
1405
+
1406
+ const HeapSnapshot* const snap = heap_profiler->TakeHeapSnapshot();
1407
+
1408
+ FileOutputStream stream(fp);
1409
+ snap->Serialize(&stream, HeapSnapshot::kJSON);
1410
+
1411
+ const_cast<HeapSnapshot*>(snap)->Delete();
1412
+
1413
+ return Qtrue;
1414
+ }
1415
+
1318
1416
  static VALUE
1319
1417
  rb_context_stop(VALUE self) {
1320
1418
 
@@ -1357,6 +1455,12 @@ nogvl_context_call(void *args) {
1357
1455
  // terminate ASAP
1358
1456
  isolate->SetData(DO_TERMINATE, (void*)false);
1359
1457
 
1458
+ if (call->max_memory > 0) {
1459
+ isolate->SetData(MEM_SOFTLIMIT_VALUE, &call->max_memory);
1460
+ isolate->SetData(MEM_SOFTLIMIT_REACHED, (void*)false);
1461
+ isolate->AddGCEpilogueCallback(gc_callback);
1462
+ }
1463
+
1360
1464
  Isolate::Scope isolate_scope(isolate);
1361
1465
  EscapableHandleScope handle_scope(isolate);
1362
1466
  TryCatch trycatch(isolate);
@@ -1414,6 +1518,13 @@ static VALUE rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1414
1518
  call_argv = argv + 1;
1415
1519
  }
1416
1520
 
1521
+ call.max_memory = 0;
1522
+ VALUE mem_softlimit = rb_iv_get(self, "@max_memory");
1523
+ if (mem_softlimit != Qnil) {
1524
+ unsigned long sl_int = NUM2ULONG(mem_softlimit);
1525
+ call.max_memory = (size_t)sl_int;
1526
+ }
1527
+
1417
1528
  bool missingFunction = false;
1418
1529
  {
1419
1530
  Locker lock(isolate);
@@ -1500,6 +1611,8 @@ extern "C" {
1500
1611
  rb_define_method(rb_cContext, "stop", (VALUE(*)(...))&rb_context_stop, 0);
1501
1612
  rb_define_method(rb_cContext, "dispose_unsafe", (VALUE(*)(...))&rb_context_dispose, 0);
1502
1613
  rb_define_method(rb_cContext, "heap_stats", (VALUE(*)(...))&rb_heap_stats, 0);
1614
+ rb_define_method(rb_cContext, "write_heap_snapshot_unsafe", (VALUE(*)(...))&rb_heap_snapshot, 1);
1615
+
1503
1616
  rb_define_private_method(rb_cContext, "create_isolate_value",(VALUE(*)(...))&rb_context_create_isolate_value, 0);
1504
1617
  rb_define_private_method(rb_cContext, "eval_unsafe",(VALUE(*)(...))&rb_context_eval_unsafe, 2);
1505
1618
  rb_define_private_method(rb_cContext, "call_unsafe", (VALUE(*)(...))&rb_context_call_unsafe, -1);
@@ -167,6 +167,28 @@ module MiniRacer
167
167
  eval(File.read(filename))
168
168
  end
169
169
 
170
+ def write_heap_snapshot(file_or_io)
171
+ f = nil
172
+ implicit = false
173
+
174
+
175
+ if String === file_or_io
176
+ f = File.open(file_or_io, "w")
177
+ implicit = true
178
+ else
179
+ f = file_or_io
180
+ end
181
+
182
+ if !(File === f)
183
+ raise ArgumentError("file_or_io")
184
+ end
185
+
186
+ write_heap_snapshot_unsafe(f)
187
+
188
+ ensure
189
+ f.close if implicit
190
+ end
191
+
170
192
  def eval(str, options=nil)
171
193
  raise(ContextDisposedError, 'attempted to call eval on a disposed context!') if @disposed
172
194
 
@@ -291,9 +313,17 @@ module MiniRacer
291
313
 
292
314
  # ensure we do not leak a thread in state
293
315
  t.join
316
+ t = nil
294
317
 
295
318
  rval
296
-
319
+ ensure
320
+ # exceptions need to be handled
321
+ if t && wp
322
+ wp.write("done")
323
+ t.join
324
+ end
325
+ wp.close if wp
326
+ rp.close if rp
297
327
  end
298
328
 
299
329
  def check_init_options!(options)
@@ -1,3 +1,3 @@
1
1
  module MiniRacer
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.10"
3
3
  end
@@ -14,18 +14,24 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/discourse/mini_racer"
15
15
  spec.license = "MIT"
16
16
 
17
+ spec.metadata = {
18
+ "bug_tracker_uri" => "https://github.com/discourse/mini_racer/issues",
19
+ "changelog_uri" => "https://github.com/discourse/mini_racer/blob/v#{spec.version}/CHANGELOG",
20
+ "documentation_uri" => "https://www.rubydoc.info/gems/mini_racer/#{spec.version}",
21
+ "source_code_uri" => "https://github.com/discourse/mini_racer/tree/v#{spec.version}",
22
+ }
17
23
 
18
24
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(benchmark|test|spec|features|examples)/}) }
19
25
  spec.bindir = "exe"
20
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
27
  spec.require_paths = ["lib"]
22
28
 
23
- spec.add_development_dependency "bundler", "~> 1.12"
29
+ spec.add_development_dependency "bundler"
24
30
  spec.add_development_dependency "rake", "~> 10.0"
25
31
  spec.add_development_dependency "minitest", "~> 5.0"
26
32
  spec.add_development_dependency "rake-compiler"
27
33
 
28
- spec.add_dependency 'libv8', '>= 6.9.411'
34
+ spec.add_dependency 'libv8', '> 7.3'
29
35
  spec.require_paths = ["lib", "ext"]
30
36
 
31
37
  spec.extensions = ["ext/mini_racer_extension/extconf.rb"]
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_racer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-25 00:00:00.000000000 Z
11
+ date: 2020-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.12'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.12'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: libv8
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ">"
74
74
  - !ruby/object:Gem::Version
75
- version: 6.9.411
75
+ version: '7.3'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - ">"
81
81
  - !ruby/object:Gem::Version
82
- version: 6.9.411
82
+ version: '7.3'
83
83
  description: Minimal embedded v8 engine for Ruby
84
84
  email:
85
85
  - sam.saffron@gmail.com
@@ -106,7 +106,11 @@ files:
106
106
  homepage: https://github.com/discourse/mini_racer
107
107
  licenses:
108
108
  - MIT
109
- metadata: {}
109
+ metadata:
110
+ bug_tracker_uri: https://github.com/discourse/mini_racer/issues
111
+ changelog_uri: https://github.com/discourse/mini_racer/blob/v0.2.10/CHANGELOG
112
+ documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.2.10
113
+ source_code_uri: https://github.com/discourse/mini_racer/tree/v0.2.10
110
114
  post_install_message:
111
115
  rdoc_options: []
112
116
  require_paths: