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 +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
|
-
[](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:
|