bud 0.9.5 → 0.9.6
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 +15 -0
- data/History.txt +25 -1
- data/bin/budlabel +0 -0
- data/bin/budplot +11 -6
- data/bin/budtimelines +2 -2
- data/bin/budvis +7 -1
- data/docs/README.md +8 -8
- data/docs/cheat.md +2 -2
- data/lib/bud.rb +46 -26
- data/lib/bud/collections.rb +82 -45
- data/lib/bud/executor/elements.rb +2 -2
- data/lib/bud/executor/join.rb +31 -28
- data/lib/bud/graphs.rb +2 -2
- data/lib/bud/lattice-core.rb +52 -33
- data/lib/bud/lattice-lib.rb +28 -25
- data/lib/bud/monkeypatch.rb +1 -1
- data/lib/bud/rebl.rb +26 -8
- data/lib/bud/rewrite.rb +40 -20
- data/lib/bud/server.rb +3 -6
- data/lib/bud/source.rb +1 -16
- data/lib/bud/state.rb +1 -1
- data/lib/bud/viz.rb +10 -11
- data/lib/bud/viz_util.rb +8 -3
- metadata +7 -31
data/lib/bud/rewrite.rb
CHANGED
@@ -3,14 +3,13 @@ require 'rubygems'
|
|
3
3
|
class RuleRewriter < Ruby2Ruby # :nodoc: all
|
4
4
|
attr_accessor :rule_indx, :rules, :depends
|
5
5
|
|
6
|
-
OP_LIST =
|
7
|
-
TEMP_OP_LIST =
|
8
|
-
MONOTONE_WHITELIST =
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
:current_value])
|
6
|
+
OP_LIST = [:<<, :<, :<=].to_set
|
7
|
+
TEMP_OP_LIST = [:-@, :~, :+@].to_set
|
8
|
+
MONOTONE_WHITELIST = [:==, :+, :<=, :-, :<, :>, :*, :~,
|
9
|
+
:pairs, :matches, :combos, :flatten, :new,
|
10
|
+
:lefts, :rights, :map, :flat_map, :pro, :merge,
|
11
|
+
:cols, :key_cols, :val_cols, :payloads, :lambda,
|
12
|
+
:tabname, :current_value].to_set
|
14
13
|
|
15
14
|
def initialize(seed, bud_instance)
|
16
15
|
@bud_instance = bud_instance
|
@@ -196,15 +195,17 @@ class RuleRewriter < Ruby2Ruby # :nodoc: all
|
|
196
195
|
Bud::Lattice.global_morphs.include?(op)
|
197
196
|
end
|
198
197
|
|
199
|
-
# Rewrite top-level rhs
|
200
|
-
#
|
198
|
+
# Rewrite top-level rhs literal expressions into lambdas. During wiring, these
|
199
|
+
# are turned into coll_expr collections. For normal relational Bloom, the only
|
200
|
+
# literal we expect to see is an array literal, but lattices can be
|
201
|
+
# initialized with other kinds of literals (e.g., integers for lmax).
|
201
202
|
def lambda_rewrite(rhs)
|
202
203
|
# the <= case
|
203
|
-
if
|
204
|
+
if is_rhs_literal(rhs[0])
|
204
205
|
return s(:iter, s(:call, nil, :lambda), s(:args), rhs)
|
205
206
|
# the superator case
|
206
207
|
elsif rhs[0] == :call \
|
207
|
-
and rhs[1] and rhs[1][0] and
|
208
|
+
and rhs[1] and rhs[1][0] and is_rhs_literal(rhs[1][0]) \
|
208
209
|
and rhs[2] and (rhs[2] == :+@ or rhs[2] == :-@ or rhs[2] == :~@)
|
209
210
|
return s(rhs[0], s(:iter, s(:call, nil, :lambda), s(:args), rhs[1]), rhs[2], *rhs[3..-1])
|
210
211
|
else
|
@@ -212,8 +213,8 @@ class RuleRewriter < Ruby2Ruby # :nodoc: all
|
|
212
213
|
end
|
213
214
|
end
|
214
215
|
|
215
|
-
def
|
216
|
-
[:array, :hash].include? e
|
216
|
+
def is_rhs_literal(e)
|
217
|
+
[:array, :hash, :lit].include? e
|
217
218
|
end
|
218
219
|
|
219
220
|
def collect_rhs(exp)
|
@@ -259,7 +260,7 @@ class RuleRewriter < Ruby2Ruby # :nodoc: all
|
|
259
260
|
rhs_ast = MapRewriter.new.process(rhs_ast)
|
260
261
|
rhs_ast = RenameRewriter.new(@bud_instance).process(rhs_ast)
|
261
262
|
rhs_ast = LatticeRefRewriter.new(@bud_instance).process(rhs_ast)
|
262
|
-
ufr = UnsafeFuncRewriter.new
|
263
|
+
ufr = UnsafeFuncRewriter.new(@bud_instance)
|
263
264
|
rhs_ast = ufr.process(rhs_ast)
|
264
265
|
|
265
266
|
if @bud_instance.options[:no_attr_rewrite]
|
@@ -336,16 +337,25 @@ class RenameRewriter < SexpProcessor
|
|
336
337
|
end
|
337
338
|
end
|
338
339
|
|
339
|
-
# Check for whether the rule invokes any "unsafe" functions (
|
340
|
-
# return a different value every time they are called, e.g., budtime).
|
341
|
-
#
|
340
|
+
# Check for whether the rule invokes any "unsafe" functions (functions that
|
341
|
+
# might return a different value every time they are called, e.g., budtime). The
|
342
|
+
# test for "unsafe" functions is pretty naive: any function call with a nil
|
343
|
+
# receiver is treated as unsafe unless it is belongs to a list of "safe"
|
344
|
+
# functions (below) or it denotes a lattice identifier. In the latter case, the
|
345
|
+
# rule is akin to an implicit join with the lattice, so we only rescan it on
|
346
|
+
# deltas to the lattice (see "rescan_on_merge" in LatticeWrapper).
|
347
|
+
#
|
348
|
+
# Although this is called a rewriter, it doesn't modify the input AST.
|
342
349
|
class UnsafeFuncRewriter < SexpProcessor
|
350
|
+
SAFE_FUNC_LIST = [:int_ip_port, :ip_port, :ip, :port].to_set
|
351
|
+
|
343
352
|
attr_reader :unsafe_func_called
|
344
353
|
|
345
|
-
def initialize
|
354
|
+
def initialize(bud_instance)
|
346
355
|
super()
|
347
356
|
self.require_empty = false
|
348
357
|
self.expected = Sexp
|
358
|
+
@bud_instance = bud_instance
|
349
359
|
@unsafe_func_called = false
|
350
360
|
@elem_stack = []
|
351
361
|
end
|
@@ -356,7 +366,9 @@ class UnsafeFuncRewriter < SexpProcessor
|
|
356
366
|
# We assume that unsafe funcs have a nil receiver (Bud instance is implicit
|
357
367
|
# receiver).
|
358
368
|
if recv.nil? and @elem_stack.size > 0
|
359
|
-
|
369
|
+
unless is_safe_func(op) || is_lattice?(op)
|
370
|
+
@unsafe_func_called = true
|
371
|
+
end
|
360
372
|
end
|
361
373
|
|
362
374
|
return s(tag, process(recv), op, *(args.map{|a| process(a)}))
|
@@ -375,6 +387,14 @@ class UnsafeFuncRewriter < SexpProcessor
|
|
375
387
|
raise Bud::Error unless @elem_stack.pop == obj_id
|
376
388
|
return rv
|
377
389
|
end
|
390
|
+
|
391
|
+
def is_lattice?(op)
|
392
|
+
@bud_instance.lattices.has_key? op.to_sym
|
393
|
+
end
|
394
|
+
|
395
|
+
def is_safe_func(op)
|
396
|
+
SAFE_FUNC_LIST.include? op
|
397
|
+
end
|
378
398
|
end
|
379
399
|
|
380
400
|
# Rewrite references to lattice identifiers that appear in rule bodies. A
|
data/lib/bud/server.rb
CHANGED
@@ -11,11 +11,8 @@ class Bud::BudServer < EM::Connection #:nodoc: all
|
|
11
11
|
|
12
12
|
def receive_data(data)
|
13
13
|
# Feed the received data to the deserializer
|
14
|
-
@pac.
|
15
|
-
|
16
|
-
# streaming deserialize
|
17
|
-
@pac.each do |obj|
|
18
|
-
message_received(obj)
|
14
|
+
@pac.feed_each(data) do |obj|
|
15
|
+
recv_message(obj)
|
19
16
|
end
|
20
17
|
|
21
18
|
# apply the channel filter to each channel's pending tuples
|
@@ -54,7 +51,7 @@ class Bud::BudServer < EM::Connection #:nodoc: all
|
|
54
51
|
@bud.rtracer.sleep if @bud.options[:rtrace]
|
55
52
|
end
|
56
53
|
|
57
|
-
def
|
54
|
+
def recv_message(obj)
|
58
55
|
unless (obj.class <= Array and obj.length == 3 and
|
59
56
|
@bud.tables.include?(obj[0].to_sym) and
|
60
57
|
obj[1].class <= Array and obj[2].class <= Array)
|
data/lib/bud/source.rb
CHANGED
@@ -17,7 +17,7 @@ module Source
|
|
17
17
|
lines = cache(filename, num)
|
18
18
|
# Note: num is 1-based.
|
19
19
|
|
20
|
-
parser =
|
20
|
+
parser = RubyParser.for_current_ruby
|
21
21
|
stmt = "" # collection of lines that form one complete Ruby statement
|
22
22
|
ast = nil
|
23
23
|
lines[num .. -1].each do |l|
|
@@ -38,21 +38,6 @@ module Source
|
|
38
38
|
ast
|
39
39
|
end
|
40
40
|
|
41
|
-
# ruby_parser 3.x can produce either 1.8- or 1.9-compatible ASTs. Since we
|
42
|
-
# want to eventually turn the ASTs back into code we can eval() using the
|
43
|
-
# current Ruby runtime, we want to generate an appropriately compatible AST.
|
44
|
-
def Source.make_parser
|
45
|
-
maj, min, patch = RUBY_VERSION.split(".")
|
46
|
-
case [maj.to_i, min.to_i]
|
47
|
-
when [1, 9] then
|
48
|
-
Ruby19Parser.new
|
49
|
-
when [1, 8] then
|
50
|
-
Ruby18Parser.new
|
51
|
-
else
|
52
|
-
raise Bud::Error, "unrecognized RUBY_VERSION: #{RUBY_VERSION}"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
41
|
def Source.cache(filename, num) # returns array of lines
|
57
42
|
if $cached_file_info.curr_file == filename
|
58
43
|
retval = $cached_file_info.lines
|
data/lib/bud/state.rb
CHANGED
data/lib/bud/viz.rb
CHANGED
@@ -3,18 +3,18 @@ require 'bud/state'
|
|
3
3
|
class VizOnline #:nodoc: all
|
4
4
|
attr_reader :logtab
|
5
5
|
|
6
|
-
META_TABLES = %w[t_cycle t_depends
|
7
|
-
|
6
|
+
META_TABLES = %w[t_cycle t_depends t_provides t_rules t_stratum
|
7
|
+
t_table_info t_table_schema t_underspecified].to_set
|
8
8
|
|
9
9
|
def initialize(bud_instance)
|
10
10
|
@bud_instance = bud_instance
|
11
11
|
@bud_instance.options[:dbm_dir] = "DBM_#{@bud_instance.class}_#{bud_instance.options[:tag]}_#{bud_instance.object_id}_#{bud_instance.port}"
|
12
12
|
@table_info = bud_instance.tables[:t_table_info]
|
13
13
|
@table_schema = bud_instance.tables[:t_table_schema]
|
14
|
-
@logtab = new_tab(
|
14
|
+
@logtab = new_tab(:the_big_log, [:table, :time, :contents], bud_instance)
|
15
15
|
tmp_set = []
|
16
16
|
@bud_instance.tables.each do |name, tbl|
|
17
|
-
next if name ==
|
17
|
+
next if name == :the_big_log || name == :localtick
|
18
18
|
# Temp collections don't have a schema until a fact has been inserted into
|
19
19
|
# them; for now, we just include an empty schema for them in the viz
|
20
20
|
if tbl.schema.nil?
|
@@ -56,11 +56,11 @@ class VizOnline #:nodoc: all
|
|
56
56
|
row = row[0]
|
57
57
|
end
|
58
58
|
|
59
|
-
# bud.t_depends and t_rules have bud object in field[0].
|
60
|
-
# bud instances cannot/must not be serialized.
|
59
|
+
# bud.t_depends and t_rules have bud object in field[0]. Replace them with
|
60
|
+
# a string, since bud instances cannot/must not be serialized.
|
61
61
|
if row[0].class <= Bud
|
62
|
-
row = row.to_a
|
63
|
-
row = [row[0].class.to_s] + row[1..-1]
|
62
|
+
row = row.to_a
|
63
|
+
row = [row[0].class.to_s] + row[1..-1]
|
64
64
|
end
|
65
65
|
newrow = [tab, @bud_instance.budtime, row]
|
66
66
|
begin
|
@@ -74,10 +74,9 @@ class VizOnline #:nodoc: all
|
|
74
74
|
def do_cards
|
75
75
|
@bud_instance.tables.each do |t|
|
76
76
|
tab = t[0]
|
77
|
-
next if tab ==
|
77
|
+
next if tab == :the_big_log
|
78
78
|
next if @bud_instance.budtime > 0 and META_TABLES.include? tab.to_s
|
79
|
-
|
80
|
-
add_rows(t[1], tab) #####unless t[1].class == Bud::BudPeriodic
|
79
|
+
add_rows(t[1], tab)
|
81
80
|
if t[1].class == Bud::BudChannel
|
82
81
|
add_rows(t[1].pending, "#{tab}_snd")
|
83
82
|
end
|
data/lib/bud/viz_util.rb
CHANGED
@@ -180,8 +180,8 @@ module VizUtil #:nodoc: all
|
|
180
180
|
convertor = Syntax::Convertors::HTML.for_syntax "ruby"
|
181
181
|
shredded_rules.each do |s|
|
182
182
|
# b/c accessors don't make it through serialization anymore
|
183
|
-
bud_obj, rule_id, lhs, op, src, orig_src,
|
184
|
-
fout = File.new("#{output_base}/#{rule_id}.html", "w+")
|
183
|
+
bud_obj, rule_id, lhs, op, src, orig_src, unsafe_funcs_called = s.to_a
|
184
|
+
fout = File.new("#{output_base}/#{rule_id}-#{lhs}.html", "w+")
|
185
185
|
fout.puts header
|
186
186
|
fout.puts "<h1>Rule #{rule_id}</h1><br>"
|
187
187
|
|
@@ -364,7 +364,12 @@ END_JS
|
|
364
364
|
def write_table_content(fn, row)
|
365
365
|
stream = File.open(fn, "a")
|
366
366
|
stream.puts "<tr>"
|
367
|
-
|
367
|
+
if row.class < Enumerable
|
368
|
+
stream.puts row.map{|c| "<td>#{c.to_s}</td>"}.join(" ")
|
369
|
+
else
|
370
|
+
# special case for periodics
|
371
|
+
stream.puts "<td>#{row.to_s}</td>"
|
372
|
+
end
|
368
373
|
stream.puts "</tr>"
|
369
374
|
stream.close
|
370
375
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Peter Alvaro
|
@@ -13,12 +12,11 @@ authors:
|
|
13
12
|
autorequire:
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
|
-
date:
|
15
|
+
date: 2013-02-25 00:00:00.000000000 Z
|
17
16
|
dependencies:
|
18
17
|
- !ruby/object:Gem::Dependency
|
19
18
|
name: eventmachine
|
20
19
|
requirement: !ruby/object:Gem::Requirement
|
21
|
-
none: false
|
22
20
|
requirements:
|
23
21
|
- - ! '>='
|
24
22
|
- !ruby/object:Gem::Version
|
@@ -26,7 +24,6 @@ dependencies:
|
|
26
24
|
type: :runtime
|
27
25
|
prerelease: false
|
28
26
|
version_requirements: !ruby/object:Gem::Requirement
|
29
|
-
none: false
|
30
27
|
requirements:
|
31
28
|
- - ! '>='
|
32
29
|
- !ruby/object:Gem::Version
|
@@ -34,7 +31,6 @@ dependencies:
|
|
34
31
|
- !ruby/object:Gem::Dependency
|
35
32
|
name: fastercsv
|
36
33
|
requirement: !ruby/object:Gem::Requirement
|
37
|
-
none: false
|
38
34
|
requirements:
|
39
35
|
- - ! '>='
|
40
36
|
- !ruby/object:Gem::Version
|
@@ -42,7 +38,6 @@ dependencies:
|
|
42
38
|
type: :runtime
|
43
39
|
prerelease: false
|
44
40
|
version_requirements: !ruby/object:Gem::Requirement
|
45
|
-
none: false
|
46
41
|
requirements:
|
47
42
|
- - ! '>='
|
48
43
|
- !ruby/object:Gem::Version
|
@@ -50,7 +45,6 @@ dependencies:
|
|
50
45
|
- !ruby/object:Gem::Dependency
|
51
46
|
name: getopt
|
52
47
|
requirement: !ruby/object:Gem::Requirement
|
53
|
-
none: false
|
54
48
|
requirements:
|
55
49
|
- - ! '>='
|
56
50
|
- !ruby/object:Gem::Version
|
@@ -58,7 +52,6 @@ dependencies:
|
|
58
52
|
type: :runtime
|
59
53
|
prerelease: false
|
60
54
|
version_requirements: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
55
|
requirements:
|
63
56
|
- - ! '>='
|
64
57
|
- !ruby/object:Gem::Version
|
@@ -66,7 +59,6 @@ dependencies:
|
|
66
59
|
- !ruby/object:Gem::Dependency
|
67
60
|
name: msgpack
|
68
61
|
requirement: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
62
|
requirements:
|
71
63
|
- - ! '>='
|
72
64
|
- !ruby/object:Gem::Version
|
@@ -74,7 +66,6 @@ dependencies:
|
|
74
66
|
type: :runtime
|
75
67
|
prerelease: false
|
76
68
|
version_requirements: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
69
|
requirements:
|
79
70
|
- - ! '>='
|
80
71
|
- !ruby/object:Gem::Version
|
@@ -82,7 +73,6 @@ dependencies:
|
|
82
73
|
- !ruby/object:Gem::Dependency
|
83
74
|
name: ruby-graphviz
|
84
75
|
requirement: !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
76
|
requirements:
|
87
77
|
- - ! '>='
|
88
78
|
- !ruby/object:Gem::Version
|
@@ -90,7 +80,6 @@ dependencies:
|
|
90
80
|
type: :runtime
|
91
81
|
prerelease: false
|
92
82
|
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
none: false
|
94
83
|
requirements:
|
95
84
|
- - ! '>='
|
96
85
|
- !ruby/object:Gem::Version
|
@@ -98,7 +87,6 @@ dependencies:
|
|
98
87
|
- !ruby/object:Gem::Dependency
|
99
88
|
name: ruby2ruby
|
100
89
|
requirement: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
90
|
requirements:
|
103
91
|
- - ! '>='
|
104
92
|
- !ruby/object:Gem::Version
|
@@ -106,7 +94,6 @@ dependencies:
|
|
106
94
|
type: :runtime
|
107
95
|
prerelease: false
|
108
96
|
version_requirements: !ruby/object:Gem::Requirement
|
109
|
-
none: false
|
110
97
|
requirements:
|
111
98
|
- - ! '>='
|
112
99
|
- !ruby/object:Gem::Version
|
@@ -114,23 +101,20 @@ dependencies:
|
|
114
101
|
- !ruby/object:Gem::Dependency
|
115
102
|
name: ruby_parser
|
116
103
|
requirement: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
104
|
requirements:
|
119
105
|
- - ! '>='
|
120
106
|
- !ruby/object:Gem::Version
|
121
|
-
version: 3.0
|
107
|
+
version: 3.1.0
|
122
108
|
type: :runtime
|
123
109
|
prerelease: false
|
124
110
|
version_requirements: !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
111
|
requirements:
|
127
112
|
- - ! '>='
|
128
113
|
- !ruby/object:Gem::Version
|
129
|
-
version: 3.0
|
114
|
+
version: 3.1.0
|
130
115
|
- !ruby/object:Gem::Dependency
|
131
116
|
name: superators19
|
132
117
|
requirement: !ruby/object:Gem::Requirement
|
133
|
-
none: false
|
134
118
|
requirements:
|
135
119
|
- - ! '>='
|
136
120
|
- !ruby/object:Gem::Version
|
@@ -138,7 +122,6 @@ dependencies:
|
|
138
122
|
type: :runtime
|
139
123
|
prerelease: false
|
140
124
|
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
125
|
requirements:
|
143
126
|
- - ! '>='
|
144
127
|
- !ruby/object:Gem::Version
|
@@ -146,7 +129,6 @@ dependencies:
|
|
146
129
|
- !ruby/object:Gem::Dependency
|
147
130
|
name: syntax
|
148
131
|
requirement: !ruby/object:Gem::Requirement
|
149
|
-
none: false
|
150
132
|
requirements:
|
151
133
|
- - ! '>='
|
152
134
|
- !ruby/object:Gem::Version
|
@@ -154,7 +136,6 @@ dependencies:
|
|
154
136
|
type: :runtime
|
155
137
|
prerelease: false
|
156
138
|
version_requirements: !ruby/object:Gem::Requirement
|
157
|
-
none: false
|
158
139
|
requirements:
|
159
140
|
- - ! '>='
|
160
141
|
- !ruby/object:Gem::Version
|
@@ -162,7 +143,6 @@ dependencies:
|
|
162
143
|
- !ruby/object:Gem::Dependency
|
163
144
|
name: uuid
|
164
145
|
requirement: !ruby/object:Gem::Requirement
|
165
|
-
none: false
|
166
146
|
requirements:
|
167
147
|
- - ! '>='
|
168
148
|
- !ruby/object:Gem::Version
|
@@ -170,7 +150,6 @@ dependencies:
|
|
170
150
|
type: :runtime
|
171
151
|
prerelease: false
|
172
152
|
version_requirements: !ruby/object:Gem::Requirement
|
173
|
-
none: false
|
174
153
|
requirements:
|
175
154
|
- - ! '>='
|
176
155
|
- !ruby/object:Gem::Version
|
@@ -178,7 +157,6 @@ dependencies:
|
|
178
157
|
- !ruby/object:Gem::Dependency
|
179
158
|
name: minitest
|
180
159
|
requirement: !ruby/object:Gem::Requirement
|
181
|
-
none: false
|
182
160
|
requirements:
|
183
161
|
- - ! '>='
|
184
162
|
- !ruby/object:Gem::Version
|
@@ -186,7 +164,6 @@ dependencies:
|
|
186
164
|
type: :development
|
187
165
|
prerelease: false
|
188
166
|
version_requirements: !ruby/object:Gem::Requirement
|
189
|
-
none: false
|
190
167
|
requirements:
|
191
168
|
- - ! '>='
|
192
169
|
- !ruby/object:Gem::Version
|
@@ -262,26 +239,25 @@ files:
|
|
262
239
|
homepage: http://www.bloom-lang.org
|
263
240
|
licenses:
|
264
241
|
- BSD
|
242
|
+
metadata: {}
|
265
243
|
post_install_message:
|
266
244
|
rdoc_options: []
|
267
245
|
require_paths:
|
268
246
|
- lib
|
269
247
|
required_ruby_version: !ruby/object:Gem::Requirement
|
270
|
-
none: false
|
271
248
|
requirements:
|
272
249
|
- - ! '>='
|
273
250
|
- !ruby/object:Gem::Version
|
274
251
|
version: 1.8.7
|
275
252
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
276
|
-
none: false
|
277
253
|
requirements:
|
278
254
|
- - ! '>='
|
279
255
|
- !ruby/object:Gem::Version
|
280
256
|
version: '0'
|
281
257
|
requirements: []
|
282
258
|
rubyforge_project: bloom-lang
|
283
|
-
rubygems_version:
|
259
|
+
rubygems_version: 2.0.0
|
284
260
|
signing_key:
|
285
|
-
specification_version:
|
261
|
+
specification_version: 4
|
286
262
|
summary: A prototype Bloom DSL for distributed programming.
|
287
263
|
test_files: []
|