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.
@@ -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: []