mruby_tools 0.0.1.1
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 +7 -0
- data/README.md +1 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/bin/mrbt +65 -0
- data/examples/driver.rb +98 -0
- data/examples/goodbye_world.rb +1 -0
- data/examples/hello_world.rb +1 -0
- data/examples/raise.rb +2 -0
- data/examples/simplex.rb +164 -0
- data/examples/timer.rb +27 -0
- data/lib/mruby_tools.rb +48 -0
- data/mruby_tools.gemspec +28 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9aa01e1c7834a6b9ba351aa1e70df7399628dc8c
|
4
|
+
data.tar.gz: 42b72b7ca714f805e00a0f73b12439d1611dbd65
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5aae2588bb3b849cba817a377f2995c55d7e0e8b27f770b9f5c991093f6c9f3032a7d2e9e64810bee44ffb8b616b2e6a1f55694297af1b8ca20bc22c1c4b5cde
|
7
|
+
data.tar.gz: 2e225121b919de40e9fbd803fbf0c3aa2cf5ebb7b0433c1bfa30e58e52cce864361f4248ef00b90892669a239d5908c0cab64b1cbf3ea72f1ee868f63dd34a40
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# MRuby Tools
|
data/Rakefile
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
Rake::TestTask.new :test do |t|
|
4
|
+
t.pattern = "test/*.rb"
|
5
|
+
t.warning = true
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
#
|
10
|
+
# METRICS
|
11
|
+
#
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'flog_task'
|
15
|
+
FlogTask.new do |t|
|
16
|
+
t.dirs = ['lib']
|
17
|
+
t.verbose = true
|
18
|
+
end
|
19
|
+
rescue LoadError
|
20
|
+
warn 'flog_task unavailable'
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
require 'flay_task'
|
25
|
+
FlayTask.new do |t|
|
26
|
+
t.dirs = ['lib']
|
27
|
+
t.verbose = true
|
28
|
+
end
|
29
|
+
rescue LoadError
|
30
|
+
warn 'flay_task unavailable'
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'roodi_task'
|
35
|
+
# RoodiTask.new config: '.roodi.yml', patterns: ['lib/**/*.rb']
|
36
|
+
RoodiTask.new patterns: ['lib/**/*.rb']
|
37
|
+
rescue LoadError
|
38
|
+
warn "roodi_task unavailable"
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# GEM BUILD / PUBLISH
|
43
|
+
#
|
44
|
+
|
45
|
+
begin
|
46
|
+
require 'buildar'
|
47
|
+
|
48
|
+
Buildar.new do |b|
|
49
|
+
b.gemspec_file = 'mruby_tools.gemspec'
|
50
|
+
b.version_file = 'VERSION'
|
51
|
+
b.use_git = true
|
52
|
+
end
|
53
|
+
rescue LoadError
|
54
|
+
warn "buildar tasks unavailable"
|
55
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1.1
|
data/bin/mrbt
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
require 'mruby_tools'
|
5
|
+
|
6
|
+
# args like: file1.rb file2.rb -o outfile
|
7
|
+
# possibly: file1.rb -o outfile file2.rb -c generated.c
|
8
|
+
|
9
|
+
opts = MRubyTools.args(ARGV)
|
10
|
+
outfile = opts.fetch(:outfile)
|
11
|
+
|
12
|
+
c_code = <<'EOF'
|
13
|
+
#include <stdlib.h>
|
14
|
+
#include <mruby.h>
|
15
|
+
#include <mruby/compile.h>
|
16
|
+
#include <mruby/string.h>
|
17
|
+
|
18
|
+
void check_exc(mrb_state *mrb, char *filename) {
|
19
|
+
if (mrb->exc) {
|
20
|
+
mrb_value exc = mrb_obj_value(mrb->exc);
|
21
|
+
mrb_value exc_msg = mrb_funcall(mrb, exc, "to_s", 0);
|
22
|
+
fprintf(stderr, "ERROR in %s - %s: %s\n",
|
23
|
+
filename,
|
24
|
+
mrb_obj_classname(mrb, exc),
|
25
|
+
mrb_str_to_cstr(mrb, exc_msg));
|
26
|
+
/* mrb_print_backtrace(mrb); # empty */
|
27
|
+
exit(1);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
int
|
32
|
+
main(void)
|
33
|
+
{
|
34
|
+
mrb_state *mrb = mrb_open();
|
35
|
+
if (!mrb) {
|
36
|
+
printf("mrb problem");
|
37
|
+
exit(1);
|
38
|
+
}
|
39
|
+
EOF
|
40
|
+
|
41
|
+
c_code += opts.fetch(:rb_files).map { |rbf|
|
42
|
+
"\n" + MRubyTools.rb2c(rbf) + "\n\n"
|
43
|
+
}.join
|
44
|
+
|
45
|
+
c_code += <<EOF
|
46
|
+
mrb_close(mrb);
|
47
|
+
return 0;
|
48
|
+
}
|
49
|
+
EOF
|
50
|
+
|
51
|
+
puts c_code + "\n" if opts[:verbose]
|
52
|
+
|
53
|
+
file = opts[:cfile] || Tempfile.new(['generated', '.c'])
|
54
|
+
file.write(c_code)
|
55
|
+
file.close
|
56
|
+
|
57
|
+
msd = MRubyTools.mruby_src_dir
|
58
|
+
|
59
|
+
gcc_args = [
|
60
|
+
'-std=c99', "-I", File.join(msd, 'include'), file.path, "-o", outfile,
|
61
|
+
File.join(msd, 'build', 'host', 'lib', 'libmruby.a'), '-lm',
|
62
|
+
]
|
63
|
+
|
64
|
+
puts "compiling..."
|
65
|
+
puts "created binary executable: #{outfile}" if system('gcc', *gcc_args)
|
data/examples/driver.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
SIMPLEX_PARAMS = [
|
2
|
+
# 1 (index 0)
|
3
|
+
[[1, 1],
|
4
|
+
[[2, 1],
|
5
|
+
[1, 2]],
|
6
|
+
[4, 3]],
|
7
|
+
|
8
|
+
[[3, 4],
|
9
|
+
[[1, 1],
|
10
|
+
[2, 1]],
|
11
|
+
[4, 5]],
|
12
|
+
|
13
|
+
[[2, -1],
|
14
|
+
[[1, 2],
|
15
|
+
[3, 2],],
|
16
|
+
[6, 12]],
|
17
|
+
|
18
|
+
[[60, 90, 300],
|
19
|
+
[[1, 1, 1],
|
20
|
+
[1, 3, 0],
|
21
|
+
[2, 0, 1]],
|
22
|
+
[600, 600, 900]],
|
23
|
+
|
24
|
+
# 5
|
25
|
+
[[70, 210, 140],
|
26
|
+
[[1, 1, 1],
|
27
|
+
[5, 4, 4],
|
28
|
+
[40, 20, 30]],
|
29
|
+
[100, 480, 3200]],
|
30
|
+
|
31
|
+
[[2, -1, 2],
|
32
|
+
[[2, 1, 0],
|
33
|
+
[1, 2, -2],
|
34
|
+
[0, 1, 2]],
|
35
|
+
[10, 20, 5]],
|
36
|
+
|
37
|
+
[[11, 16, 15],
|
38
|
+
[[1, 2, 3.to_f / 2],
|
39
|
+
[2.to_f / 3, 2.to_f / 3, 1],
|
40
|
+
[0.5, 1.to_f / 3, 0.5]],
|
41
|
+
[12_000, 4_600, 2_400]],
|
42
|
+
|
43
|
+
[[5, 4, 3],
|
44
|
+
[[2, 3, 1],
|
45
|
+
[4, 1, 2],
|
46
|
+
[3, 4, 2]],
|
47
|
+
[5, 11, 8]],
|
48
|
+
|
49
|
+
[[3, 2, -4],
|
50
|
+
[[1, 4, 0],
|
51
|
+
[2, 4,-2],
|
52
|
+
[1, 1,-2]],
|
53
|
+
[5, 6, 2]],
|
54
|
+
|
55
|
+
# 10
|
56
|
+
[[2, -1, 8],
|
57
|
+
[[2, -4, 6],
|
58
|
+
[-1, 3, 4],
|
59
|
+
[0, 0, 2]],
|
60
|
+
[3, 2, 1]],
|
61
|
+
|
62
|
+
[[100_000, 40_000, 18_000],
|
63
|
+
[[20, 6, 3],
|
64
|
+
[0, 1, 0],
|
65
|
+
[-1,-1, 1],
|
66
|
+
[-9, 1, 1]],
|
67
|
+
[182, 10, 0, 0]],
|
68
|
+
|
69
|
+
[[1, 2, 1, 2],
|
70
|
+
[[1, 0, 1, 0],
|
71
|
+
[0, 1, 0, 1],
|
72
|
+
[1, 1, 0, 0],
|
73
|
+
[0, 0, 1, 1]],
|
74
|
+
[1, 4, 2, 2]],
|
75
|
+
|
76
|
+
[[10, -57, -9, -24],
|
77
|
+
[[0.5, -5.5, -2.5, 9],
|
78
|
+
[0.5, -1.5, -0.5, 1],
|
79
|
+
[ 1, 0, 0, 0]],
|
80
|
+
[0, 0, 1]],
|
81
|
+
|
82
|
+
# 14 (index 13)
|
83
|
+
[[25, 20],
|
84
|
+
[[20, 12],
|
85
|
+
[1, 1]],
|
86
|
+
[1800, 8*15]],
|
87
|
+
]
|
88
|
+
|
89
|
+
def simplices
|
90
|
+
SIMPLEX_PARAMS.map { |c, a, b| Simplex.new(c, a, b) }
|
91
|
+
end
|
92
|
+
|
93
|
+
puts "calculating #{SIMPLEX_PARAMS.size} simplex solutions, repeatedly..."
|
94
|
+
val, elapsed = Timer.loop_avg {
|
95
|
+
simplices.map { |s| s.solution }.join("\n")
|
96
|
+
}
|
97
|
+
|
98
|
+
puts "%0.8f s (avg) per solution" % (elapsed / SIMPLEX_PARAMS.size)
|
@@ -0,0 +1 @@
|
|
1
|
+
puts :goodbye_world
|
@@ -0,0 +1 @@
|
|
1
|
+
puts :hello_world
|
data/examples/raise.rb
ADDED
data/examples/simplex.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
class Simplex
|
2
|
+
DEFAULT_MAX_PIVOTS = 10_000
|
3
|
+
|
4
|
+
class Error < RuntimeError; end
|
5
|
+
class UnboundedProblem < Error; end
|
6
|
+
class SanityCheck < Error; end
|
7
|
+
class TooManyPivots < Error; end
|
8
|
+
|
9
|
+
attr_accessor :max_pivots
|
10
|
+
|
11
|
+
# c - coefficients of objective function; size: num_vars
|
12
|
+
# a - inequality lhs coefficients; 2dim size: num_inequalities, num_vars
|
13
|
+
# b - inequality rhs constants size: num_inequalities
|
14
|
+
def initialize(c, a, b)
|
15
|
+
num_vars = c.size
|
16
|
+
num_inequalities = b.size
|
17
|
+
raise(ArgumentError, "a doesn't match b") unless a.size == num_inequalities
|
18
|
+
raise(ArgumentError, "a doesn't match c") unless a.first.size == num_vars
|
19
|
+
|
20
|
+
@max_pivots = DEFAULT_MAX_PIVOTS
|
21
|
+
|
22
|
+
# Problem dimensions; these never change
|
23
|
+
@num_non_slack_vars = num_vars
|
24
|
+
@num_constraints = num_inequalities
|
25
|
+
@num_vars = @num_non_slack_vars + @num_constraints
|
26
|
+
|
27
|
+
# Set up initial matrix A and vectors b, c
|
28
|
+
@c = c.map { |flt| -1 * flt } + Array.new(@num_constraints, 0)
|
29
|
+
@a = a.map.with_index { |ary, i|
|
30
|
+
if ary.size != @num_non_slack_vars
|
31
|
+
raise ArgumentError, "a is inconsistent"
|
32
|
+
end
|
33
|
+
ary + Array.new(@num_constraints) { |ci| ci == i ? 1 : 0 }
|
34
|
+
}
|
35
|
+
@b = b
|
36
|
+
|
37
|
+
# set initial solution: all non-slack variables = 0
|
38
|
+
@basic_vars = (@num_non_slack_vars...@num_vars).to_a
|
39
|
+
self.update_solution
|
40
|
+
end
|
41
|
+
|
42
|
+
# does not modify vector / matrix
|
43
|
+
def update_solution
|
44
|
+
@x = Array.new(@num_vars, 0)
|
45
|
+
|
46
|
+
@basic_vars.each { |basic_var|
|
47
|
+
idx = nil
|
48
|
+
@num_constraints.times { |i|
|
49
|
+
if @a[i][basic_var] == 1
|
50
|
+
idx =i
|
51
|
+
break
|
52
|
+
end
|
53
|
+
}
|
54
|
+
raise(SanityCheck, "no idx for basic_var #{basic_var} in a") unless idx
|
55
|
+
@x[basic_var] = @b[idx]
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def solution
|
60
|
+
self.solve
|
61
|
+
self.current_solution
|
62
|
+
end
|
63
|
+
|
64
|
+
def solve
|
65
|
+
count = 0
|
66
|
+
while self.can_improve?
|
67
|
+
count += 1
|
68
|
+
raise(TooManyPivots, count.to_s) unless count < @max_pivots
|
69
|
+
self.pivot
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def current_solution
|
74
|
+
@x[0...@num_non_slack_vars]
|
75
|
+
end
|
76
|
+
|
77
|
+
def can_improve?
|
78
|
+
!self.entering_variable.nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
# idx of @c's minimum negative value
|
82
|
+
# nil when no improvement is possible
|
83
|
+
#
|
84
|
+
def entering_variable
|
85
|
+
(0...@c.size).select { |i| @c[i] < 0 }.min_by { |i| @c[i] }
|
86
|
+
end
|
87
|
+
|
88
|
+
def pivot
|
89
|
+
pivot_column = self.entering_variable or return nil
|
90
|
+
pivot_row = self.pivot_row(pivot_column) or raise UnboundedProblem
|
91
|
+
leaving_var = nil
|
92
|
+
@a[pivot_row].each_with_index { |a, i|
|
93
|
+
if a == 1 and @basic_vars.include?(i)
|
94
|
+
leaving_var = i
|
95
|
+
break
|
96
|
+
end
|
97
|
+
}
|
98
|
+
raise(SanityCheck, "no leaving_var") if leaving_var.nil?
|
99
|
+
|
100
|
+
@basic_vars.delete(leaving_var)
|
101
|
+
@basic_vars.push(pivot_column)
|
102
|
+
@basic_vars.sort!
|
103
|
+
|
104
|
+
pivot_ratio = 1.to_f / @a[pivot_row][pivot_column]
|
105
|
+
|
106
|
+
# update pivot row
|
107
|
+
@a[pivot_row] = @a[pivot_row].map { |val| val * pivot_ratio }
|
108
|
+
@b[pivot_row] = @b[pivot_row] * pivot_ratio
|
109
|
+
|
110
|
+
# update objective
|
111
|
+
# @c -= @c[pivot_column] * @a[pivot_row]
|
112
|
+
@c = @c.map.with_index { |val, i|
|
113
|
+
val - @c[pivot_column] * @a[pivot_row][i]
|
114
|
+
}
|
115
|
+
|
116
|
+
# update A and B
|
117
|
+
@num_constraints.times { |i|
|
118
|
+
next if i == pivot_row
|
119
|
+
r = @a[i][pivot_column]
|
120
|
+
@a[i] = @a[i].map.with_index { |val, j| val - r * @a[pivot_row][j] }
|
121
|
+
@b[i] = @b[i] - r * @b[pivot_row]
|
122
|
+
}
|
123
|
+
|
124
|
+
self.update_solution
|
125
|
+
end
|
126
|
+
|
127
|
+
def pivot_row(column_ix)
|
128
|
+
min_ratio = nil
|
129
|
+
idx = nil
|
130
|
+
@num_constraints.times { |i|
|
131
|
+
a, b = @a[i][column_ix], @b[i]
|
132
|
+
next if a == 0 or (b < 0) ^ (a < 0)
|
133
|
+
ratio = b.to_f / a
|
134
|
+
idx, min_ratio = i, ratio if min_ratio.nil? or ratio <= min_ratio
|
135
|
+
}
|
136
|
+
idx
|
137
|
+
end
|
138
|
+
|
139
|
+
def formatted_tableau
|
140
|
+
if self.can_improve?
|
141
|
+
pivot_column = self.entering_variable
|
142
|
+
pivot_row = self.pivot_row(pivot_column)
|
143
|
+
else
|
144
|
+
pivot_row = nil
|
145
|
+
end
|
146
|
+
c = @c.to_a.map { |flt| "%2.3f" % flt }
|
147
|
+
b = @b.to_a.map { |flt| "%2.3f" % flt }
|
148
|
+
a = @a.to_a.map { |vec| vec.to_a.map { |flt| "%2.3f" % flt } }
|
149
|
+
if pivot_row
|
150
|
+
a[pivot_row][pivot_column] = "*" + a[pivot_row][pivot_column]
|
151
|
+
end
|
152
|
+
max = (c + b + a + ["1234567"]).flatten.map(&:size).max
|
153
|
+
result = []
|
154
|
+
result << c.map { |str| str.rjust(max, " ") }
|
155
|
+
a.zip(b) do |arow, brow|
|
156
|
+
result << (arow + [brow]).map { |val| val.rjust(max, " ") }
|
157
|
+
result.last.insert(arow.length, "|")
|
158
|
+
end
|
159
|
+
lines = result.map { |ary| ary.join(" ") }
|
160
|
+
max_line_length = lines.map(&:length).max
|
161
|
+
lines.insert(1, "-"*max_line_length)
|
162
|
+
lines.join("\n")
|
163
|
+
end
|
164
|
+
end
|
data/examples/timer.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Timer
|
2
|
+
def self.now
|
3
|
+
Time.now
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.since(t)
|
7
|
+
self.now - t
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.elapsed(&work)
|
11
|
+
t = self.now
|
12
|
+
return yield, self.since(t)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.loop_avg(count = 999, seconds = 1, &work)
|
16
|
+
i = 0
|
17
|
+
start = self.now
|
18
|
+
val = nil
|
19
|
+
loop {
|
20
|
+
val = yield
|
21
|
+
i += 1
|
22
|
+
break if i >= count
|
23
|
+
break if self.since(start) > seconds
|
24
|
+
}
|
25
|
+
return val, self.since(start) / i.to_f
|
26
|
+
end
|
27
|
+
end
|
data/lib/mruby_tools.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module MRubyTools
|
2
|
+
def self.rb2c(rb_filename, indent: ' ')
|
3
|
+
c_str = File.read(rb_filename)
|
4
|
+
size = c_str.size
|
5
|
+
c_str = c_str.gsub("\n", '\n').gsub('"', '\"')
|
6
|
+
c_str = File.read(rb_filename).gsub("\n", '\n').gsub('"', '\"')
|
7
|
+
[ "/* #{rb_filename} */",
|
8
|
+
'mrb_load_nstring(mrb, "' + c_str + '", ' + "#{size});",
|
9
|
+
"check_exc(mrb, \"#{rb_filename}\");",
|
10
|
+
].map { |s| indent + s }.join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.mruby_src_dir(env_var = 'MRUBY_SRC')
|
14
|
+
mruby_src_dir = ENV[env_var]
|
15
|
+
raise "env: MRUBY_SRC is required" unless mruby_src_dir
|
16
|
+
raise "bad MRUBY_SRC #{mruby_src_dir}" unless File.directory? mruby_src_dir
|
17
|
+
mruby_inc_dir = File.join(mruby_src_dir, 'include')
|
18
|
+
raise "bad MRUBY_SRC #{mruby_inc_dir}" unless File.directory? mruby_inc_dir
|
19
|
+
mruby_src_dir
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.args(argv = ARGV)
|
23
|
+
rb_files = []
|
24
|
+
outfile = nil
|
25
|
+
cfile = nil
|
26
|
+
verbose = false
|
27
|
+
|
28
|
+
while !argv.empty?
|
29
|
+
arg = argv.shift
|
30
|
+
if arg == '-o'
|
31
|
+
outfile = argv.shift
|
32
|
+
raise "no outfile provided with -o" unless outfile
|
33
|
+
raise "#{outfile} is misnamed" if File.extname(outfile) == '.rb'
|
34
|
+
elsif arg == '-c'
|
35
|
+
cfile = File.open(argv.shift || 'generated.c', "w")
|
36
|
+
elsif arg == '-v'
|
37
|
+
verbose = true
|
38
|
+
else
|
39
|
+
rb_files << arg
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
{ verbose: verbose,
|
44
|
+
cfile: cfile,
|
45
|
+
outfile: outfile || 'outfile',
|
46
|
+
rb_files: rb_files }
|
47
|
+
end
|
48
|
+
end
|
data/mruby_tools.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'mruby_tools'
|
3
|
+
s.summary = "MRI Ruby tools for assisting in MRuby development"
|
4
|
+
s.description = "TBD"
|
5
|
+
s.authors = ["Rick Hull"]
|
6
|
+
s.homepage = "https://github.com/rickhull/mruby-tools"
|
7
|
+
s.license = "LGPL-3.0"
|
8
|
+
|
9
|
+
s.required_ruby_version = "~> 2"
|
10
|
+
|
11
|
+
s.version = File.read(File.join(__dir__, 'VERSION')).chomp
|
12
|
+
|
13
|
+
s.files = %w[mruby_tools.gemspec VERSION README.md Rakefile]
|
14
|
+
%w[lib bin test examples].each { |dir|
|
15
|
+
s.files += Dir[File.join(dir, '**', '*.rb')]
|
16
|
+
}
|
17
|
+
|
18
|
+
s.executables << 'mrbt'
|
19
|
+
|
20
|
+
s.add_development_dependency "rake", "~> 0"
|
21
|
+
s.add_development_dependency "buildar", "~> 3.0"
|
22
|
+
# s.add_development_dependency "minitest", "~> 5.0"
|
23
|
+
# s.add_development_dependency "flog", "~> 0"
|
24
|
+
# s.add_development_dependency "flay", "~> 0"
|
25
|
+
# s.add_development_dependency "roodi", "~> 0"
|
26
|
+
# s.add_development_dependency "ruby-prof", "~> 0"
|
27
|
+
# s.add_development_dependency "benchmark-ips", "~> 2.0"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mruby_tools
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rick Hull
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-11-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: buildar
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
description: TBD
|
42
|
+
email:
|
43
|
+
executables:
|
44
|
+
- mrbt
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- README.md
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- bin/mrbt
|
52
|
+
- examples/driver.rb
|
53
|
+
- examples/goodbye_world.rb
|
54
|
+
- examples/hello_world.rb
|
55
|
+
- examples/raise.rb
|
56
|
+
- examples/simplex.rb
|
57
|
+
- examples/timer.rb
|
58
|
+
- lib/mruby_tools.rb
|
59
|
+
- mruby_tools.gemspec
|
60
|
+
homepage: https://github.com/rickhull/mruby-tools
|
61
|
+
licenses:
|
62
|
+
- LGPL-3.0
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - "~>"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '2'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.6.8
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: MRI Ruby tools for assisting in MRuby development
|
84
|
+
test_files: []
|