ceml 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
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