bud 0.9.4 → 0.9.9
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/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: []
|