ceml 0.6.1 → 0.6.2

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.1
1
+ 0.6.2
data/ceml.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ceml}
8
- s.version = "0.6.1"
8
+ s.version = "0.6.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joe Edelman"]
12
- s.date = %q{2011-01-28}
12
+ s.date = %q{2011-01-30}
13
13
  s.description = %q{a language for coordinating real world events}
14
14
  s.email = %q{joe@citizenlogistics.com}
15
15
  s.extra_rdoc_files = [
data/lib/ceml/driver.rb CHANGED
@@ -86,7 +86,7 @@ module CEML
86
86
  updated_players.each do |player|
87
87
  player_id = player[:id]
88
88
  player[:roles] = Set.new([*player[:roles] || []])
89
- player[:roles] << :agents
89
+ player[:roles] << :agents << :players
90
90
  if existing_player = players.find{ |p| p[:id] == player_id }
91
91
  existing_player[:roles] += player.delete :roles
92
92
  existing_player.update player
@@ -96,13 +96,20 @@ module CEML
96
96
  end
97
97
  incident.run(players) do |player, meth, what|
98
98
  meth = "player_#{meth}"
99
- send(meth, incident.id, metadata, player, what) if respond_to? meth
99
+ log "[#{incident.id}] #{meth}: #{player[:id]} #{what.inspect}"
100
+ if respond_to? meth
101
+ metadata.update :player => player, :players => players, :id => incident.id
102
+ result = send(meth, metadata, what)
103
+ metadata.delete :player
104
+ metadata.delete :players
105
+ result
106
+ end
100
107
  end
101
108
  end
102
109
 
103
110
  JUST_SAID = {}
104
- def player_said(incident_id, metadata, player, what)
105
- JUST_SAID[player[:id]] = what
111
+ def player_said(data, what)
112
+ JUST_SAID[data[:player][:id]] = what
106
113
  puts "Said #{what.inspect}"
107
114
  end
108
115
  end
data/lib/ceml/incident.rb CHANGED
@@ -35,35 +35,51 @@ module CEML
35
35
  @callback = @players = nil
36
36
  end
37
37
 
38
+ def role_info
39
+ { :is_transient => is_transient? }
40
+ end
41
+
42
+ def is_transient?
43
+ main_seq.none? do |opcode, arg|
44
+ case opcode
45
+ when :start_delay, :ask_q, :assign, :null_assign then true
46
+ end
47
+ end
48
+ end
49
+
50
+ def main_seq
51
+ bytecode = []
52
+ instrs = script.instructions_for(roles)
53
+ instrs.each do |inst|
54
+ if inst.delay
55
+ bytecode << [:start_delay, inst.delay]
56
+ bytecode << [:complete_delay]
57
+ end
58
+ case inst.cmd
59
+ when :register
60
+ bytecode << [:answered_q, {:key => inst.key}]
61
+ when :ask
62
+ bytecode << [:ask_q, {:text => inst.text}]
63
+ bytecode << [:answered_q, {:key => inst.key}]
64
+ when :tell
65
+ bytecode << [:send_msg, {:text=>inst.text}]
66
+ when :assign
67
+ bytecode << [:assign, {:text=>inst.text}]
68
+ bytecode << [:complete_assign, {:text=>inst.text}]
69
+ end
70
+ end
71
+ if instrs.empty? and script.title
72
+ bytecode << [:null_assign]
73
+ bytecode << [:complete_assign]
74
+ end
75
+ bytecode
76
+ end
77
+
38
78
  def seq
39
79
  @seq ||= {}
40
80
  @seq[roles] ||= begin
41
- bytecode = [[:start]]
42
- instrs = script.instructions_for(roles)
43
- instrs.each do |inst|
44
- if inst.delay
45
- bytecode << [:start_delay, inst.delay]
46
- bytecode << [:complete_delay]
47
- end
48
- case inst.cmd
49
- when :register
50
- bytecode << [:answered_q, inst]
51
- when :ask
52
- bytecode << [:ask_q, inst]
53
- bytecode << [:answered_q, inst]
54
- when :tell
55
- if script.title
56
- bytecode << [:assign, inst]
57
- bytecode << [:complete_assign, inst]
58
- else
59
- bytecode << [:send_msg, inst]
60
- end
61
- end
62
- end
63
- if instrs.empty? and script.title
64
- bytecode << [:null_assign]
65
- bytecode << [:complete_assign]
66
- end
81
+ bytecode = [[:start, role_info]]
82
+ bytecode.concat main_seq
67
83
  bytecode << [:finish]
68
84
  end
69
85
  end
@@ -83,6 +99,17 @@ module CEML
83
99
  nil
84
100
  end
85
101
 
102
+ INTERPOLATE_REGEX = /\|(\w+)\.?(\w+)?\|/
103
+
104
+ def interpolate(text)
105
+ text =~ INTERPOLATE_REGEX or return text
106
+ text.gsub(INTERPOLATE_REGEX) do |m|
107
+ var, role = *[$2, $1].compact
108
+ expand(role, var) or return false
109
+ end
110
+ end
111
+
112
+
86
113
  # ==============
87
114
  # = basic flow =
88
115
  # ==============
@@ -91,7 +118,7 @@ module CEML
91
118
  cb :said, params.merge(:said => x)
92
119
  end
93
120
 
94
- def start; true; end
121
+ def start(x); true; end
95
122
  def finish; true; end
96
123
 
97
124
  def start_delay seconds
@@ -106,26 +133,26 @@ module CEML
106
133
  end
107
134
 
108
135
  def ask_q q
109
- text = q.interpolate(self) or return false
136
+ text = interpolate(q[:text]) or return false
110
137
  say :ask, :q => text
111
138
  true
112
139
  end
113
140
 
114
141
  def answered_q q
115
142
  got or return false
116
- qs_answers[q.key] = got
143
+ qs_answers[q[:key]] = got
117
144
  handled!
118
145
  true
119
146
  end
120
147
 
121
148
  def send_msg a
122
- text = a.interpolate(self) or return false
149
+ text = interpolate(a[:text]) or return false
123
150
  say :message, :msg => text
124
151
  true
125
152
  end
126
153
 
127
154
  def assign a
128
- text = a.interpolate(self) or return false
155
+ text = interpolate(a[:text]) or return false
129
156
  say :assignment, :msg => text
130
157
  true
131
158
  end
@@ -133,6 +160,7 @@ module CEML
133
160
  def complete_assign a = nil
134
161
  got or return false
135
162
  if recognized == :done
163
+ cb :did_complete
136
164
  say :ok
137
165
  handled!
138
166
  true
data/lib/ceml/script.rb CHANGED
@@ -16,7 +16,7 @@ module CEML
16
16
  end
17
17
 
18
18
  def nabs?
19
- cast.type == :nab
19
+ cast.type == :nab or !title
20
20
  end
21
21
 
22
22
 
@@ -71,7 +71,7 @@ module CEML
71
71
 
72
72
  def cast
73
73
  return casting_statement if respond_to? :casting_statement
74
- return DefaultDP.new nil, [:agents], 0, :nab
74
+ return DefaultDP.new nil, [:agents], 0, :gather
75
75
  end
76
76
 
77
77
  def_delegators :cast, :radius
@@ -5,16 +5,6 @@ grammar Instructions
5
5
  rule basic_statement
6
6
  (ask_stmt / tell_stmt / assign_stmt / register_stmt) {
7
7
 
8
- INTERPOLATE_REGEX = /\|(\w+)\.?(\w+)?\|/
9
-
10
- def interpolate(env)
11
- text =~ INTERPOLATE_REGEX or return text
12
- text.gsub(INTERPOLATE_REGEX) do |m|
13
- var, role = *[$2, $1].compact
14
- env.expand(role, var) or return false
15
- end
16
- end
17
-
18
8
  def delay
19
9
  if parent.respond_to? :later and not parent.later.empty?
20
10
  parent.later.duration.seconds
@@ -29,9 +19,10 @@ grammar Instructions
29
19
  end
30
20
  def key; var || text; end
31
21
  def cmd;
32
- text_value =~ /^ask/ and return :ask
33
- text_value =~ /^(tell|assign)/ and return :tell
34
- text_value =~ /^register/ and return :register
22
+ text_value =~ /^ask/ and return :ask
23
+ text_value =~ /^tell/ and return :tell
24
+ text_value =~ /^assign/ and return :assign
25
+ text_value =~ /^register/ and return :register
35
26
  end
36
27
  }
37
28
  end
@@ -135,6 +135,23 @@ class TestIncident < Test::Unit::TestCase
135
135
  end
136
136
  end
137
137
 
138
+ def test_interpolation
139
+ s = "\"Soccer in the park\"\ngather 2 players within 1mi\nask players re color: which color?\ntell players: its |someone.color|\n"
140
+ s = CEML.parse(:script, s)
141
+ instrs = s.instructions_for(s.roles)
142
+ assert !instrs.empty?
143
+ play s do
144
+ player :bill, :players
145
+ player :fred, :players
146
+ asked :bill, /color\?/i
147
+ asked :fred, /color\?/i
148
+ says :bill, 'red'
149
+ says :fred, 'blue'
150
+ told :fred, /its red/i
151
+ told :bill, /its blue/i
152
+ end
153
+ end
154
+
138
155
  def test_await
139
156
  s = CEML.parse(:script, "await a,b,c\ntell a: foo\ntell b: bar\ntell c: baz")
140
157
  play do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 6
8
- - 1
9
- version: 0.6.1
8
+ - 2
9
+ version: 0.6.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joe Edelman
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-28 00:00:00 -07:00
17
+ date: 2011-01-30 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency