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 +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
|