bud 0.9.4 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/History.txt +106 -0
- data/README.md +6 -4
- data/Rakefile +91 -0
- data/bin/budlabel +63 -0
- data/bin/budplot +18 -8
- data/bin/budtimelines +2 -2
- data/bin/budvis +7 -1
- data/docs/README.md +8 -17
- data/docs/cheat.md +112 -13
- data/docs/getstarted.md +97 -84
- data/docs/operational.md +3 -3
- data/examples/basics/paths.rb +2 -2
- data/examples/chat/README.md +2 -0
- data/examples/chat/chat.rb +3 -2
- data/examples/chat/chat_protocol.rb +2 -2
- data/examples/chat/chat_server.rb +3 -2
- data/lib/bud.rb +229 -114
- data/lib/bud/aggs.rb +20 -4
- data/lib/bud/bud_meta.rb +83 -73
- data/lib/bud/collections.rb +306 -120
- data/lib/bud/depanalysis.rb +3 -4
- data/lib/bud/executor/README.rescan +2 -1
- data/lib/bud/executor/elements.rb +96 -95
- data/lib/bud/executor/group.rb +35 -32
- data/lib/bud/executor/join.rb +164 -183
- data/lib/bud/graphs.rb +3 -3
- data/lib/bud/labeling/bloomgraph.rb +47 -0
- data/lib/bud/labeling/budplot_style.rb +53 -0
- data/lib/bud/labeling/labeling.rb +288 -0
- data/lib/bud/lattice-core.rb +595 -0
- data/lib/bud/lattice-lib.rb +422 -0
- data/lib/bud/monkeypatch.rb +68 -32
- data/lib/bud/rebl.rb +28 -10
- data/lib/bud/rewrite.rb +361 -152
- data/lib/bud/server.rb +16 -8
- data/lib/bud/source.rb +21 -18
- data/lib/bud/state.rb +93 -4
- data/lib/bud/storage/zookeeper.rb +45 -33
- data/lib/bud/version.rb +3 -0
- data/lib/bud/viz.rb +10 -12
- data/lib/bud/viz_util.rb +8 -3
- metadata +107 -108
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,12 +51,23 @@ class Bud::BudServer < EM::Connection #:nodoc: all
|
|
54
51
|
@bud.rtracer.sleep if @bud.options[:rtrace]
|
55
52
|
end
|
56
53
|
|
57
|
-
def
|
58
|
-
unless (obj.class <= Array and obj.length ==
|
59
|
-
@bud.tables.include?(obj[0].to_sym) and
|
54
|
+
def recv_message(obj)
|
55
|
+
unless (obj.class <= Array and obj.length == 3 and
|
56
|
+
@bud.tables.include?(obj[0].to_sym) and
|
57
|
+
obj[1].class <= Array and obj[2].class <= Array)
|
60
58
|
raise Bud::Error, "bad inbound message of class #{obj.class}: #{obj.inspect}"
|
61
59
|
end
|
62
60
|
|
61
|
+
# Deserialize any nested marshalled values
|
62
|
+
tbl_name, tuple, marshall_indexes = obj
|
63
|
+
marshall_indexes.each do |i|
|
64
|
+
if i < 0 || i >= tuple.length
|
65
|
+
raise Bud::Error, "bad inbound message: marshalled value at index #{i}, #{obj.inspect}"
|
66
|
+
end
|
67
|
+
tuple[i] = Marshal.load(tuple[i])
|
68
|
+
end
|
69
|
+
|
70
|
+
obj = [tbl_name, tuple]
|
63
71
|
@bud.rtracer.recv(obj) if @bud.options[:rtrace]
|
64
72
|
@filter_buf[obj[0].to_sym] ||= []
|
65
73
|
@filter_buf[obj[0].to_sym] << obj[1]
|
data/lib/bud/source.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'ruby_parser'
|
3
|
-
require 'bud/errors'
|
4
2
|
|
5
3
|
module Source
|
6
4
|
$cached_file_info = Struct.new(:curr_file, :lines, :last_state_bloom_line).new
|
@@ -8,31 +6,36 @@ module Source
|
|
8
6
|
# Reads the block corresponding to the location (string of the form
|
9
7
|
# "file:line_num"). Returns an ast for the block.
|
10
8
|
def Source.read_block(location)
|
11
|
-
|
9
|
+
if location.start_with? '('
|
10
|
+
raise Bud::IllegalSourceError, "source must be present in a file; cannot read interactive shell or eval block"
|
11
|
+
end
|
12
12
|
location =~ /^(.*):(\d+)/
|
13
13
|
filename, num = $1, $2.to_i
|
14
|
-
|
14
|
+
if filename.nil?
|
15
|
+
raise Bud::IllegalSourceError, "couldn't determine filename from backtrace"
|
16
|
+
end
|
15
17
|
lines = cache(filename, num)
|
16
18
|
# Note: num is 1-based.
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
stmt = ""
|
22
|
-
endok = true #
|
20
|
+
# for_current_ruby might object if the current Ruby version is not supported
|
21
|
+
# by RubyParser; bravely try to continue on regardless
|
22
|
+
parser = RubyParser.for_current_ruby rescue RubyParser.new
|
23
|
+
stmt = "" # collection of lines that form one complete Ruby statement
|
23
24
|
ast = nil
|
24
25
|
lines[num .. -1].each do |l|
|
25
26
|
next if l =~ /^\s*#/
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
if l =~ /^\s*([}]|end)/
|
28
|
+
# We found some syntax that looks like it might terminate the Ruby
|
29
|
+
# statement. Hence, try to parse it; if we don't find a syntax error,
|
30
|
+
# we're done.
|
31
|
+
begin
|
32
|
+
ast = parser.parse stmt
|
33
|
+
break
|
34
|
+
rescue
|
35
|
+
ast = nil
|
36
|
+
end
|
35
37
|
end
|
38
|
+
stmt += l + "\n"
|
36
39
|
end
|
37
40
|
ast
|
38
41
|
end
|
data/lib/bud/state.rb
CHANGED
@@ -2,7 +2,7 @@ module Bud
|
|
2
2
|
######## methods for registering collection types
|
3
3
|
private
|
4
4
|
def check_collection_name(name)
|
5
|
-
if @tables.has_key? name
|
5
|
+
if @tables.has_key? name or @lattices.has_key? name
|
6
6
|
raise Bud::CompileError, "collection already exists: #{name}"
|
7
7
|
end
|
8
8
|
|
@@ -26,6 +26,18 @@ module Bud
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
def define_lattice(name)
|
30
|
+
check_collection_name(name)
|
31
|
+
|
32
|
+
self.singleton_class.send(:define_method, name) do |*args, &blk|
|
33
|
+
if blk.nil?
|
34
|
+
return @lattices[name]
|
35
|
+
else
|
36
|
+
return @lattices[name].pro(&blk)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
29
41
|
public
|
30
42
|
def input # :nodoc: all
|
31
43
|
true
|
@@ -116,9 +128,9 @@ module Bud
|
|
116
128
|
end
|
117
129
|
|
118
130
|
# declare a collection to be read from +filename+. rhs of statements only
|
119
|
-
def file_reader(name, filename
|
131
|
+
def file_reader(name, filename)
|
120
132
|
define_collection(name)
|
121
|
-
@tables[name] = Bud::BudFileReader.new(name, filename,
|
133
|
+
@tables[name] = Bud::BudFileReader.new(name, filename, self)
|
122
134
|
end
|
123
135
|
|
124
136
|
# declare a collection to be auto-populated every +period+ seconds. schema <tt>[:key] => [:val]</tt>.
|
@@ -137,7 +149,84 @@ module Bud
|
|
137
149
|
@terminal = name
|
138
150
|
end
|
139
151
|
define_collection(name)
|
140
|
-
@tables[name] = Bud::BudTerminal.new(name,
|
152
|
+
@tables[name] = Bud::BudTerminal.new(name, self)
|
141
153
|
@channels[name] = @tables[name]
|
142
154
|
end
|
155
|
+
|
156
|
+
# an alternative approach to declaring interfaces
|
157
|
+
def interfaces(direction, collections)
|
158
|
+
mode = case direction
|
159
|
+
when :input then true
|
160
|
+
when :output then false
|
161
|
+
else
|
162
|
+
raise Bud::CompileError, "unrecognized interface type #{direction}"
|
163
|
+
end
|
164
|
+
collections.each do |tab|
|
165
|
+
t_provides << [tab.to_s, mode]
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Define methods to implement the state declarations for every registered kind
|
170
|
+
# of lattice.
|
171
|
+
def load_lattice_defs
|
172
|
+
Bud::Lattice.global_mfuncs.each do |m|
|
173
|
+
next if RuleRewriter::MONOTONE_WHITELIST.include? m
|
174
|
+
if Bud::BudCollection.instance_methods.include? m.to_s
|
175
|
+
puts "monotone method #{m} conflicts with non-monotonic method in BudCollection"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
Bud::Lattice.global_morphs.each do |m|
|
180
|
+
next if RuleRewriter::MONOTONE_WHITELIST.include? m
|
181
|
+
if Bud::BudCollection.instance_methods.include? m.to_s
|
182
|
+
puts "morphism #{m} conflicts with non-monotonic method in BudCollection"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# Sanity-check lattice definitions
|
187
|
+
# XXX: We should do this only once per lattice
|
188
|
+
Bud::Lattice.lattice_kinds.each do |wrap_name, klass|
|
189
|
+
unless klass.method_defined? :merge
|
190
|
+
raise Bud::CompileError, "lattice #{wrap_name} does not define a merge function"
|
191
|
+
end
|
192
|
+
|
193
|
+
# If a method is marked as monotone in any lattice, every lattice that
|
194
|
+
# declares a method of that name must also mark it as monotone.
|
195
|
+
meth_list = klass.instance_methods(false).to_set
|
196
|
+
Bud::Lattice.global_mfuncs.each do |m|
|
197
|
+
next unless meth_list.include? m.to_s
|
198
|
+
unless klass.mfuncs.include? m
|
199
|
+
raise Bud::CompileError, "method #{m} in #{wrap_name} must be monotone"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# Apply a similar check for morphs
|
204
|
+
Bud::Lattice.global_morphs.each do |m|
|
205
|
+
next unless meth_list.include? m.to_s
|
206
|
+
unless klass.morphs.include? m
|
207
|
+
raise Bud::CompileError, "method #{m} in #{wrap_name} must be a morph"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Similarly, check for non-monotone lattice methods that are found in the
|
212
|
+
# builtin list of monotone operators. The "merge" method is implicitly
|
213
|
+
# monotone (XXX: should it be declared as a morph or monotone function?)
|
214
|
+
meth_list.each do |m_str|
|
215
|
+
m = m_str.to_sym
|
216
|
+
next unless RuleRewriter::MONOTONE_WHITELIST.include? m
|
217
|
+
# XXX: ugly hack. We want to allow lattice class implementations to
|
218
|
+
# define their own equality semantics.
|
219
|
+
next if m == :==
|
220
|
+
unless klass.mfuncs.include?(m) || klass.morphs.include?(m) || m == :merge
|
221
|
+
raise Bud::CompileError, "method #{m} in #{wrap_name} must be monotone"
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
# XXX: replace "self" with toplevel?
|
226
|
+
self.singleton_class.send(:define_method, wrap_name) do |lat_name|
|
227
|
+
define_lattice(lat_name)
|
228
|
+
@lattices[lat_name] = Bud::LatticeWrapper.new(lat_name, klass, self)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
143
232
|
end
|
@@ -8,40 +8,70 @@ module Bud
|
|
8
8
|
# Persistent table implementation based on Zookeeper.
|
9
9
|
class BudZkTable < BudPersistentCollection # :nodoc: all
|
10
10
|
def initialize(name, zk_path, zk_addr, bud_instance)
|
11
|
-
unless defined? HAVE_ZOOKEEPER
|
11
|
+
unless defined? Bud::HAVE_ZOOKEEPER
|
12
12
|
raise Bud::Error, "zookeeper gem is not installed: zookeeper-backed stores cannot be used"
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
super(name, bud_instance, nil)
|
15
|
+
super(name, bud_instance, [:key] => [:val, :opts])
|
17
16
|
|
18
|
-
zk_path = zk_path.chomp("/") unless zk_path == "/"
|
19
17
|
@zk = Zookeeper.new(zk_addr)
|
18
|
+
zk_path = zk_path.chomp("/") unless zk_path == "/"
|
20
19
|
@zk_path = zk_path
|
21
20
|
@base_path = @zk_path
|
22
21
|
@base_path += "/" unless @zk_path.end_with? "/"
|
23
22
|
@store_mutex = Mutex.new
|
23
|
+
@zk_mutex = Mutex.new
|
24
24
|
@next_storage = {}
|
25
25
|
@saw_delta = false
|
26
26
|
@child_watch_id = nil
|
27
|
-
|
27
|
+
end
|
28
|
+
|
29
|
+
def invalidate_at_tick
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def invalidate_cache
|
28
34
|
end
|
29
35
|
|
30
36
|
# Since the watcher callbacks might invoke EventMachine, we wait until after
|
31
37
|
# EM startup to start watching for Zk events.
|
32
38
|
def start_watchers
|
33
|
-
#
|
34
|
-
|
35
|
-
|
39
|
+
# Watcher callbacks are invoked in a separate Ruby thread. Note that there
|
40
|
+
# is a possible deadlock between invoking watcher callbacks and calling
|
41
|
+
# close(): if we get a watcher event and a close at around the same time,
|
42
|
+
# the close might fire first. Closing the Zk handle will block on
|
43
|
+
# dispatching outstanding watchers, but it does so holding the @zk_mutex,
|
44
|
+
# causing a deadlock. Hence, we just have the watcher callback spin on the
|
45
|
+
# @zk_mutex, aborting if the handle is ever closed.
|
46
|
+
@child_watcher = Zookeeper::Callbacks::WatcherCallback.new do
|
47
|
+
while true
|
48
|
+
break if @zk.closed?
|
49
|
+
if @zk_mutex.try_lock
|
50
|
+
get_and_watch unless @zk.closed?
|
51
|
+
@zk_mutex.unlock
|
52
|
+
break
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
@stat_watcher = Zookeeper::Callbacks::WatcherCallback.new do
|
58
|
+
while true
|
59
|
+
break if @zk.closed?
|
60
|
+
if @zk_mutex.try_lock
|
61
|
+
stat_and_watch unless @zk.closed?
|
62
|
+
@zk_mutex.unlock
|
63
|
+
break
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
36
68
|
stat_and_watch
|
37
69
|
end
|
38
70
|
|
39
71
|
def stat_and_watch
|
40
72
|
r = @zk.stat(:path => @zk_path, :watcher => @stat_watcher)
|
41
|
-
@stat_watch_id = r[:req_id]
|
42
73
|
|
43
74
|
unless r[:stat].exists
|
44
|
-
cancel_child_watch
|
45
75
|
# The given @zk_path doesn't exist, so try to create it. Unclear
|
46
76
|
# whether this is always the best behavior.
|
47
77
|
r = @zk.create(:path => @zk_path)
|
@@ -54,27 +84,10 @@ module Bud
|
|
54
84
|
get_and_watch unless @child_watch_id
|
55
85
|
end
|
56
86
|
|
57
|
-
def cancel_child_watch
|
58
|
-
if @child_watch_id
|
59
|
-
@zk.unregister_watcher(@child_watch_id)
|
60
|
-
@child_watch_id = nil
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def cancel_stat_watch
|
65
|
-
if @stat_watch_id
|
66
|
-
@zk.unregister_watcher(@stat_watch_id)
|
67
|
-
@stat_with_id = nil
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
87
|
def get_and_watch
|
72
88
|
r = @zk.get_children(:path => @zk_path, :watcher => @child_watcher)
|
89
|
+
return unless r[:stat].exists
|
73
90
|
@child_watch_id = r[:req_id]
|
74
|
-
unless r[:stat].exists
|
75
|
-
cancel_child_watch
|
76
|
-
return
|
77
|
-
end
|
78
91
|
|
79
92
|
# XXX: can we easily get snapshot isolation?
|
80
93
|
new_children = {}
|
@@ -128,8 +141,8 @@ module Bud
|
|
128
141
|
ephemeral = false
|
129
142
|
sequence = false
|
130
143
|
|
131
|
-
|
132
|
-
|
144
|
+
opts = t.opts
|
145
|
+
unless opts.nil?
|
133
146
|
if opts[:ephemeral] == true
|
134
147
|
ephemeral = true
|
135
148
|
end
|
@@ -150,9 +163,8 @@ module Bud
|
|
150
163
|
end
|
151
164
|
|
152
165
|
def close
|
153
|
-
|
154
|
-
|
155
|
-
@zk.close
|
166
|
+
# See notes in start_watchers.
|
167
|
+
@zk_mutex.synchronize { @zk.close }
|
156
168
|
end
|
157
169
|
|
158
170
|
superator "<~" do |o|
|
data/lib/bud/version.rb
ADDED
data/lib/bud/viz.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
require 'bud/state'
|
2
|
-
require 'set'
|
3
2
|
|
4
3
|
class VizOnline #:nodoc: all
|
5
4
|
attr_reader :logtab
|
6
5
|
|
7
|
-
META_TABLES = %w[t_cycle t_depends
|
8
|
-
|
6
|
+
META_TABLES = %w[t_cycle t_depends t_provides t_rule_stratum t_rules t_stratum
|
7
|
+
t_table_info t_table_schema t_underspecified].to_set
|
9
8
|
|
10
9
|
def initialize(bud_instance)
|
11
10
|
@bud_instance = bud_instance
|
12
11
|
@bud_instance.options[:dbm_dir] = "DBM_#{@bud_instance.class}_#{bud_instance.options[:tag]}_#{bud_instance.object_id}_#{bud_instance.port}"
|
13
12
|
@table_info = bud_instance.tables[:t_table_info]
|
14
13
|
@table_schema = bud_instance.tables[:t_table_schema]
|
15
|
-
@logtab = new_tab(
|
14
|
+
@logtab = new_tab(:the_big_log, [:table, :time, :contents], bud_instance)
|
16
15
|
tmp_set = []
|
17
16
|
@bud_instance.tables.each do |name, tbl|
|
18
|
-
next if name ==
|
17
|
+
next if name == :the_big_log || name == :localtick
|
19
18
|
# Temp collections don't have a schema until a fact has been inserted into
|
20
19
|
# them; for now, we just include an empty schema for them in the viz
|
21
20
|
if tbl.schema.nil?
|
@@ -57,11 +56,11 @@ class VizOnline #:nodoc: all
|
|
57
56
|
row = row[0]
|
58
57
|
end
|
59
58
|
|
60
|
-
#
|
61
|
-
#
|
59
|
+
# t_depends, t_rule_stratum, and t_rules have Bud object as their first
|
60
|
+
# field. Replace with a string, since Bud instances cannot be serialized.
|
62
61
|
if row[0].class <= Bud
|
63
|
-
row = row.to_a
|
64
|
-
row = [row[0].class.to_s] + row[1..-1]
|
62
|
+
row = row.to_a
|
63
|
+
row = [row[0].class.to_s] + row[1..-1]
|
65
64
|
end
|
66
65
|
newrow = [tab, @bud_instance.budtime, row]
|
67
66
|
begin
|
@@ -75,10 +74,9 @@ class VizOnline #:nodoc: all
|
|
75
74
|
def do_cards
|
76
75
|
@bud_instance.tables.each do |t|
|
77
76
|
tab = t[0]
|
78
|
-
next if tab ==
|
77
|
+
next if tab == :the_big_log
|
79
78
|
next if @bud_instance.budtime > 0 and META_TABLES.include? tab.to_s
|
80
|
-
|
81
|
-
add_rows(t[1], tab) #####unless t[1].class == Bud::BudPeriodic
|
79
|
+
add_rows(t[1], tab)
|
82
80
|
if t[1].class == Bud::BudChannel
|
83
81
|
add_rows(t[1].pending, "#{tab}_snd")
|
84
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.9
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Peter Alvaro
|
@@ -10,187 +9,179 @@ authors:
|
|
10
9
|
- Joseph M. Hellerstein
|
11
10
|
- William R. Marczak
|
12
11
|
- Sriram Srinivasan
|
13
|
-
autorequire:
|
12
|
+
autorequire:
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
|
-
date:
|
15
|
+
date: 2020-09-01 00:00:00.000000000 Z
|
17
16
|
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: backports
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - '='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 3.8.0
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - '='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 3.8.0
|
18
31
|
- !ruby/object:Gem::Dependency
|
19
32
|
name: eventmachine
|
20
33
|
requirement: !ruby/object:Gem::Requirement
|
21
|
-
none: false
|
22
34
|
requirements:
|
23
|
-
- -
|
35
|
+
- - '='
|
24
36
|
- !ruby/object:Gem::Version
|
25
|
-
version:
|
37
|
+
version: 1.2.5
|
26
38
|
type: :runtime
|
27
39
|
prerelease: false
|
28
40
|
version_requirements: !ruby/object:Gem::Requirement
|
29
|
-
none: false
|
30
41
|
requirements:
|
31
|
-
- -
|
42
|
+
- - '='
|
32
43
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
44
|
+
version: 1.2.5
|
34
45
|
- !ruby/object:Gem::Dependency
|
35
46
|
name: fastercsv
|
36
47
|
requirement: !ruby/object:Gem::Requirement
|
37
|
-
none: false
|
38
48
|
requirements:
|
39
|
-
- -
|
49
|
+
- - '='
|
40
50
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
51
|
+
version: 1.5.5
|
42
52
|
type: :runtime
|
43
53
|
prerelease: false
|
44
54
|
version_requirements: !ruby/object:Gem::Requirement
|
45
|
-
none: false
|
46
55
|
requirements:
|
47
|
-
- -
|
56
|
+
- - '='
|
48
57
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
58
|
+
version: 1.5.5
|
50
59
|
- !ruby/object:Gem::Dependency
|
51
60
|
name: getopt
|
52
61
|
requirement: !ruby/object:Gem::Requirement
|
53
|
-
none: false
|
54
62
|
requirements:
|
55
|
-
- -
|
63
|
+
- - '='
|
56
64
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
65
|
+
version: 1.4.3
|
58
66
|
type: :runtime
|
59
67
|
prerelease: false
|
60
68
|
version_requirements: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
69
|
requirements:
|
63
|
-
- -
|
70
|
+
- - '='
|
64
71
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
72
|
+
version: 1.4.3
|
66
73
|
- !ruby/object:Gem::Dependency
|
67
74
|
name: msgpack
|
68
75
|
requirement: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
76
|
requirements:
|
71
|
-
- -
|
77
|
+
- - '='
|
72
78
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
79
|
+
version: 1.1.0
|
74
80
|
type: :runtime
|
75
81
|
prerelease: false
|
76
82
|
version_requirements: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
83
|
requirements:
|
79
|
-
- -
|
84
|
+
- - '='
|
80
85
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
86
|
+
version: 1.1.0
|
82
87
|
- !ruby/object:Gem::Dependency
|
83
88
|
name: ruby-graphviz
|
84
89
|
requirement: !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
90
|
requirements:
|
87
|
-
- -
|
91
|
+
- - '='
|
88
92
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
93
|
+
version: 1.2.3
|
90
94
|
type: :runtime
|
91
95
|
prerelease: false
|
92
96
|
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
none: false
|
94
97
|
requirements:
|
95
|
-
- -
|
98
|
+
- - '='
|
96
99
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
100
|
+
version: 1.2.3
|
98
101
|
- !ruby/object:Gem::Dependency
|
99
102
|
name: ruby2ruby
|
100
103
|
requirement: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
104
|
requirements:
|
103
|
-
- -
|
105
|
+
- - '='
|
104
106
|
- !ruby/object:Gem::Version
|
105
|
-
version:
|
107
|
+
version: 2.4.4
|
106
108
|
type: :runtime
|
107
109
|
prerelease: false
|
108
110
|
version_requirements: !ruby/object:Gem::Requirement
|
109
|
-
none: false
|
110
111
|
requirements:
|
111
|
-
- -
|
112
|
+
- - '='
|
112
113
|
- !ruby/object:Gem::Version
|
113
|
-
version:
|
114
|
+
version: 2.4.4
|
114
115
|
- !ruby/object:Gem::Dependency
|
115
116
|
name: ruby_parser
|
116
117
|
requirement: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
118
|
requirements:
|
119
|
-
- -
|
119
|
+
- - '='
|
120
120
|
- !ruby/object:Gem::Version
|
121
|
-
version:
|
121
|
+
version: 3.10.1
|
122
122
|
type: :runtime
|
123
123
|
prerelease: false
|
124
124
|
version_requirements: !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
125
|
requirements:
|
127
|
-
- -
|
126
|
+
- - '='
|
128
127
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
128
|
+
version: 3.10.1
|
130
129
|
- !ruby/object:Gem::Dependency
|
131
130
|
name: superators19
|
132
131
|
requirement: !ruby/object:Gem::Requirement
|
133
|
-
none: false
|
134
132
|
requirements:
|
135
|
-
- -
|
133
|
+
- - '='
|
136
134
|
- !ruby/object:Gem::Version
|
137
|
-
version:
|
135
|
+
version: 0.9.3
|
138
136
|
type: :runtime
|
139
137
|
prerelease: false
|
140
138
|
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
139
|
requirements:
|
143
|
-
- -
|
140
|
+
- - '='
|
144
141
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
142
|
+
version: 0.9.3
|
146
143
|
- !ruby/object:Gem::Dependency
|
147
144
|
name: syntax
|
148
145
|
requirement: !ruby/object:Gem::Requirement
|
149
|
-
none: false
|
150
146
|
requirements:
|
151
|
-
- -
|
147
|
+
- - '='
|
152
148
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
149
|
+
version: 1.2.2
|
154
150
|
type: :runtime
|
155
151
|
prerelease: false
|
156
152
|
version_requirements: !ruby/object:Gem::Requirement
|
157
|
-
none: false
|
158
153
|
requirements:
|
159
|
-
- -
|
154
|
+
- - '='
|
160
155
|
- !ruby/object:Gem::Version
|
161
|
-
version:
|
156
|
+
version: 1.2.2
|
162
157
|
- !ruby/object:Gem::Dependency
|
163
158
|
name: uuid
|
164
159
|
requirement: !ruby/object:Gem::Requirement
|
165
|
-
none: false
|
166
160
|
requirements:
|
167
|
-
- -
|
161
|
+
- - '='
|
168
162
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
163
|
+
version: 2.3.8
|
170
164
|
type: :runtime
|
171
165
|
prerelease: false
|
172
166
|
version_requirements: !ruby/object:Gem::Requirement
|
173
|
-
none: false
|
174
167
|
requirements:
|
175
|
-
- -
|
168
|
+
- - '='
|
176
169
|
- !ruby/object:Gem::Version
|
177
|
-
version:
|
170
|
+
version: 2.3.8
|
178
171
|
- !ruby/object:Gem::Dependency
|
179
172
|
name: minitest
|
180
173
|
requirement: !ruby/object:Gem::Requirement
|
181
|
-
none: false
|
182
174
|
requirements:
|
183
|
-
- -
|
175
|
+
- - '='
|
184
176
|
- !ruby/object:Gem::Version
|
185
|
-
version:
|
177
|
+
version: 2.5.1
|
186
178
|
type: :development
|
187
179
|
prerelease: false
|
188
180
|
version_requirements: !ruby/object:Gem::Requirement
|
189
|
-
none: false
|
190
181
|
requirements:
|
191
|
-
- -
|
182
|
+
- - '='
|
192
183
|
- !ruby/object:Gem::Version
|
193
|
-
version:
|
184
|
+
version: 2.5.1
|
194
185
|
description: A prototype of the Bloom distributed programming language as a Ruby DSL.
|
195
186
|
email:
|
196
187
|
- bloomdevs@gmail.com
|
@@ -199,19 +190,54 @@ executables:
|
|
199
190
|
- budplot
|
200
191
|
- budvis
|
201
192
|
- budtimelines
|
193
|
+
- budlabel
|
202
194
|
extensions: []
|
203
195
|
extra_rdoc_files: []
|
204
196
|
files:
|
197
|
+
- History.txt
|
198
|
+
- LICENSE
|
199
|
+
- README.md
|
200
|
+
- Rakefile
|
201
|
+
- bin/budlabel
|
202
|
+
- bin/budplot
|
203
|
+
- bin/budtimelines
|
204
|
+
- bin/budvis
|
205
|
+
- bin/rebl
|
206
|
+
- docs/README.md
|
207
|
+
- docs/bfs.md
|
208
|
+
- docs/bfs_arch.png
|
209
|
+
- docs/bloom-loop.png
|
210
|
+
- docs/cheat.md
|
211
|
+
- docs/getstarted.md
|
212
|
+
- docs/intro.md
|
213
|
+
- docs/modules.md
|
214
|
+
- docs/operational.md
|
215
|
+
- docs/rebl.md
|
216
|
+
- docs/ruby_hooks.md
|
217
|
+
- docs/visualizations.md
|
218
|
+
- examples/README.md
|
219
|
+
- examples/basics/hello.rb
|
220
|
+
- examples/basics/paths.rb
|
221
|
+
- examples/chat/README.md
|
222
|
+
- examples/chat/chat.rb
|
223
|
+
- examples/chat/chat_protocol.rb
|
224
|
+
- examples/chat/chat_server.rb
|
225
|
+
- lib/bud.rb
|
205
226
|
- lib/bud/aggs.rb
|
206
227
|
- lib/bud/bud_meta.rb
|
207
228
|
- lib/bud/collections.rb
|
208
229
|
- lib/bud/depanalysis.rb
|
209
230
|
- lib/bud/errors.rb
|
231
|
+
- lib/bud/executor/README.rescan
|
210
232
|
- lib/bud/executor/elements.rb
|
211
233
|
- lib/bud/executor/group.rb
|
212
234
|
- lib/bud/executor/join.rb
|
213
|
-
- lib/bud/executor/README.rescan
|
214
235
|
- lib/bud/graphs.rb
|
236
|
+
- lib/bud/labeling/bloomgraph.rb
|
237
|
+
- lib/bud/labeling/budplot_style.rb
|
238
|
+
- lib/bud/labeling/labeling.rb
|
239
|
+
- lib/bud/lattice-core.rb
|
240
|
+
- lib/bud/lattice-lib.rb
|
215
241
|
- lib/bud/meta_algebra.rb
|
216
242
|
- lib/bud/metrics.rb
|
217
243
|
- lib/bud/monkeypatch.rb
|
@@ -223,58 +249,31 @@ files:
|
|
223
249
|
- lib/bud/state.rb
|
224
250
|
- lib/bud/storage/dbm.rb
|
225
251
|
- lib/bud/storage/zookeeper.rb
|
252
|
+
- lib/bud/version.rb
|
226
253
|
- lib/bud/viz.rb
|
227
254
|
- lib/bud/viz_util.rb
|
228
|
-
- lib/bud.rb
|
229
|
-
- bin/budplot
|
230
|
-
- bin/budtimelines
|
231
|
-
- bin/budvis
|
232
|
-
- bin/rebl
|
233
|
-
- docs/bfs.md
|
234
|
-
- docs/bfs_arch.png
|
235
|
-
- docs/bloom-loop.png
|
236
|
-
- docs/cheat.md
|
237
|
-
- docs/getstarted.md
|
238
|
-
- docs/intro.md
|
239
|
-
- docs/modules.md
|
240
|
-
- docs/operational.md
|
241
|
-
- docs/README.md
|
242
|
-
- docs/rebl.md
|
243
|
-
- docs/ruby_hooks.md
|
244
|
-
- docs/visualizations.md
|
245
|
-
- examples/basics/hello.rb
|
246
|
-
- examples/basics/paths.rb
|
247
|
-
- examples/chat/chat.rb
|
248
|
-
- examples/chat/chat_protocol.rb
|
249
|
-
- examples/chat/chat_server.rb
|
250
|
-
- examples/chat/README.md
|
251
|
-
- examples/README.md
|
252
|
-
- README.md
|
253
|
-
- LICENSE
|
254
|
-
- History.txt
|
255
255
|
homepage: http://www.bloom-lang.org
|
256
256
|
licenses:
|
257
|
-
- BSD
|
258
|
-
|
257
|
+
- BSD-3-Clause
|
258
|
+
metadata: {}
|
259
|
+
post_install_message:
|
259
260
|
rdoc_options: []
|
260
261
|
require_paths:
|
261
262
|
- lib
|
262
263
|
required_ruby_version: !ruby/object:Gem::Requirement
|
263
|
-
none: false
|
264
264
|
requirements:
|
265
|
-
- -
|
265
|
+
- - ">="
|
266
266
|
- !ruby/object:Gem::Version
|
267
|
-
version: 1.
|
267
|
+
version: 1.9.3
|
268
268
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
|
-
none: false
|
270
269
|
requirements:
|
271
|
-
- -
|
270
|
+
- - ">="
|
272
271
|
- !ruby/object:Gem::Version
|
273
272
|
version: '0'
|
274
273
|
requirements: []
|
275
274
|
rubyforge_project: bloom-lang
|
276
|
-
rubygems_version:
|
277
|
-
signing_key:
|
278
|
-
specification_version:
|
275
|
+
rubygems_version: 2.6.11
|
276
|
+
signing_key:
|
277
|
+
specification_version: 4
|
279
278
|
summary: A prototype Bloom DSL for distributed programming.
|
280
279
|
test_files: []
|