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 +1 -1
- data/ceml.gemspec +2 -2
- data/lib/ceml/driver.rb +11 -4
- data/lib/ceml/incident.rb +59 -31
- data/lib/ceml/script.rb +2 -2
- data/lib/ceml/tt/instructions.treetop +4 -13
- data/test/test_incident.rb +17 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
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.
|
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-
|
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
|
-
|
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(
|
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
|
-
|
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;
|
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 =
|
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
|
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 =
|
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 =
|
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, :
|
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/
|
33
|
-
text_value =~ /^
|
34
|
-
text_value =~ /^
|
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
|
data/test/test_incident.rb
CHANGED
@@ -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
|
-
-
|
9
|
-
version: 0.6.
|
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-
|
17
|
+
date: 2011-01-30 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|