bud 0.9.4 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.feed data
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 message_received(obj)
58
- unless (obj.class <= Array and obj.length == 2 and
59
- @bud.tables.include?(obj[0].to_sym) and obj[1].class <= Array)
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]
@@ -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
- raise Bud::IllegalSourceError, "source must be present in a file; cannot read interactive shell or eval block" if location.start_with? '('
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
- raise Bud::IllegalSourceError, "couldn't determine filename from backtrace" if filename.nil?
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
- src_asts = [] # array of SrcAsts to be returned
19
- ruby_parser = RubyParser.new
20
-
21
- stmt = "" # collection of lines that form one complete ruby statement
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
- break if endok and l =~ /^\s*([}]|end)/
27
- stmt += l + "\n"
28
- begin
29
- ast = ruby_parser.parse stmt
30
- endok = true
31
- rescue => ex
32
- # puts "Syntax Error on #{l}: #{ex}"
33
- endok = false
34
- ast = nil
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
@@ -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, delimiter='\n')
131
+ def file_reader(name, filename)
120
132
  define_collection(name)
121
- @tables[name] = Bud::BudFileReader.new(name, filename, delimiter, self)
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, [:line], self)
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
- # schema = {[:key] => [:val]}
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
- @stat_watch_id = nil
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
- # NB: Watcher callbacks are invoked in a separate Ruby thread.
34
- @child_watcher = Zookeeper::WatcherCallback.new { get_and_watch }
35
- @stat_watcher = Zookeeper::WatcherCallback.new { stat_and_watch }
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
- if t.length > 2
132
- opts = t.last.first
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
- cancel_child_watch
154
- cancel_stat_watch
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|
@@ -0,0 +1,3 @@
1
+ module Bud
2
+ VERSION = "0.9.9"
3
+ end
@@ -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 t_depends_tc t_provides t_rules
8
- t_stratum t_table_info t_table_schema].to_set
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("the_big_log", [:table, :time, :contents], bud_instance)
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 == "the_big_log"
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
- # bud.t_depends and t_rules have bud object in field[0]. Remove them since
61
- # bud instances cannot/must not be serialized.
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 if row.class != Array
64
- row = [row[0].class.to_s] + row[1..-1] if row[0].class <= Bud
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 == "the_big_log"
77
+ next if tab == :the_big_log
79
78
  next if @bud_instance.budtime > 0 and META_TABLES.include? tab.to_s
80
- # PAA: why did we previously exclude periodics?
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
@@ -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, nm_funcs_called = s.to_a
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
- stream.puts row.map{|c| "<td>#{c.to_s}</td>"}.join(" ")
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.4
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: 2012-09-06 00:00:00.000000000 Z
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: 1.3.1
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: 1.3.1
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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
- post_install_message:
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.8.7
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: 1.8.24
277
- signing_key:
278
- specification_version: 3
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: []