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 +4 -4
- data/.travis.yml +2 -1
- data/CHANGELOG +30 -0
- data/README.md +24 -3
- data/Rakefile +41 -0
- data/ext/mini_racer_extension/extconf.rb +6 -1
- data/ext/mini_racer_extension/mini_racer_extension.cc +130 -17
- data/lib/mini_racer.rb +31 -1
- data/lib/mini_racer/version.rb +1 -1
- data/mini_racer.gemspec +8 -2
- metadata +15 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a50c6aea93635efc351ce95def252df6edb3fbede6a0372272f8c9cd58f9aaed
|
4
|
+
data.tar.gz: b01cd6a98eca13db18d539ed259e4acd968eb073582979ff06f78a5df54a4207
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cac0258ac9f1f93245b00b313d004504d770e9dce3eb5ac9a8d547a1b24cd3649ec9039d9c7429ff7871f9f8d3c07e260997d86647905ba433688f361bd72611
|
7
|
+
data.tar.gz: b054a38013e7bcffe689c3732d7d95abbaf61c350dab275ff7e04e667bc5f15ae9863a706beb2848681b8d69cc1194c0bb87014a4c49e2f49d14a4289b1f6436
|
data/.travis.yml
CHANGED
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/
|
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/
|
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
|
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::
|
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
|
|
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
|
|
442
445
|
return rb_hash;
|
443
446
|
}
|
444
447
|
|
445
|
-
|
446
|
-
|
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 =
|
1088
|
-
|
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(
|
1099
|
-
|
1122
|
+
context->Global()->Set(
|
1123
|
+
v8_str, FunctionTemplate::New(isolate, ruby_callback, external)
|
1124
|
+
->GetFunction(context)
|
1125
|
+
.ToLocalChecked());
|
1100
1126
|
|
1101
|
-
|
1102
|
-
|
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
|
-
|
1136
|
+
parse_error = true;
|
1107
1137
|
} else {
|
1108
|
-
MaybeLocal<Value> maybe_value =
|
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
|
-
|
1115
|
-
|
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);
|
data/lib/mini_racer.rb
CHANGED
@@ -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)
|
data/lib/mini_racer/version.rb
CHANGED
data/mini_racer.gemspec
CHANGED
@@ -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"
|
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', '
|
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.
|
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:
|
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: '
|
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: '
|
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:
|
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:
|
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:
|