mini_racer 0.2.5 → 0.2.10

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
  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: