ceml 0.5.5 → 0.5.6
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 +19 -17
- data/lib/ceml/incident.rb +16 -6
- data/lib/ceml/instruction_statements.rb +1 -1
- data/lib/ceml/tt/instructions.treetop +17 -3
- data/lib/ceml/tt/lexer.treetop +12 -2
- data/test/helper.rb +4 -0
- data/test/test_incident.rb +12 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.6
|
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.5.
|
8
|
+
s.version = "0.5.6"
|
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-18}
|
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
@@ -36,23 +36,28 @@ module CEML
|
|
36
36
|
with_incident(id, script)
|
37
37
|
end
|
38
38
|
|
39
|
-
def post incident_id, player
|
39
|
+
def post incident_id, player = nil
|
40
40
|
with_incident incident_id do |incident, players|
|
41
41
|
subpost incident, players, player
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def subpost incident, players, player
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
existing_player[:
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
def subpost incident, players, player = nil
|
46
|
+
if player
|
47
|
+
player_id = player[:id]
|
48
|
+
player[:roles] = Set.new([*player[:roles] || []])
|
49
|
+
player[:roles] << :agents
|
50
|
+
if existing_player = players.find{ |p| p[:id] == player_id }
|
51
|
+
existing_player[:roles] += player.delete :roles
|
52
|
+
existing_player.update player
|
53
|
+
else
|
54
|
+
players << player
|
55
|
+
end
|
56
|
+
end
|
57
|
+
incident.run(players) do |player, meth, what|
|
58
|
+
meth = "player_#{meth}"
|
59
|
+
send(meth, incident.id, player, what) if respond_to? meth
|
54
60
|
end
|
55
|
-
run incident, players
|
56
61
|
end
|
57
62
|
|
58
63
|
JUST_SAID = {}
|
@@ -61,11 +66,8 @@ module CEML
|
|
61
66
|
puts "Said #{what.inspect}"
|
62
67
|
end
|
63
68
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
send(meth, incident.id, player, what) if respond_to? meth
|
68
|
-
end
|
69
|
-
end
|
69
|
+
# def player_delay(incident_id, player, seconds)
|
70
|
+
# sleep seconds if seconds < 20
|
71
|
+
# end
|
70
72
|
end
|
71
73
|
end
|
data/lib/ceml/incident.rb
CHANGED
@@ -41,6 +41,10 @@ module CEML
|
|
41
41
|
bytecode = [[:start]]
|
42
42
|
instrs = script.instructions_for(roles)
|
43
43
|
instrs.each do |inst|
|
44
|
+
if inst.delay
|
45
|
+
bytecode << [:start_delay, inst.delay]
|
46
|
+
bytecode << [:complete_delay]
|
47
|
+
end
|
44
48
|
case inst.cmd
|
45
49
|
when :register
|
46
50
|
bytecode << [:answered_q, inst]
|
@@ -84,8 +88,18 @@ module CEML
|
|
84
88
|
cb :said, params.merge(:said => x)
|
85
89
|
end
|
86
90
|
|
87
|
-
def start
|
88
|
-
|
91
|
+
def start; true; end
|
92
|
+
def finish; true; end
|
93
|
+
|
94
|
+
def start_delay seconds
|
95
|
+
this[:continue_at] = Time.now.utc.to_i + seconds
|
96
|
+
cb :delay, seconds
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
|
+
def complete_delay
|
101
|
+
return false unless Time.now.utc.to_i >= this[:continue_at]
|
102
|
+
this.delete(:continue_at)
|
89
103
|
true
|
90
104
|
end
|
91
105
|
|
@@ -131,9 +145,5 @@ module CEML
|
|
131
145
|
say :proceed
|
132
146
|
true
|
133
147
|
end
|
134
|
-
|
135
|
-
def finish
|
136
|
-
true
|
137
|
-
end
|
138
148
|
end
|
139
149
|
end
|
@@ -2,7 +2,7 @@ module CEML
|
|
2
2
|
grammar Instructions
|
3
3
|
include Lexer
|
4
4
|
|
5
|
-
rule
|
5
|
+
rule basic_statement
|
6
6
|
(ask_stmt / tell_stmt / assign_stmt / register_stmt) {
|
7
7
|
|
8
8
|
INTERPOLATE_REGEX = /\|(\w+)\.?(\w+)?\|/
|
@@ -15,6 +15,12 @@ grammar Instructions
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def delay
|
19
|
+
if parent.respond_to? :later and not parent.later.empty?
|
20
|
+
parent.later.duration.seconds
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
18
24
|
def role; id.text_value.to_sym; end
|
19
25
|
def text; super.text_value; end
|
20
26
|
def var
|
@@ -23,13 +29,21 @@ grammar Instructions
|
|
23
29
|
end
|
24
30
|
def key; var || text; end
|
25
31
|
def cmd;
|
26
|
-
text_value =~ /^ask/
|
32
|
+
text_value =~ /^ask/ and return :ask
|
27
33
|
text_value =~ /^(tell|assign)/ and return :tell
|
28
|
-
text_value =~ /^register/
|
34
|
+
text_value =~ /^register/ and return :register
|
29
35
|
end
|
30
36
|
}
|
31
37
|
end
|
32
38
|
|
39
|
+
rule instruction_stmt
|
40
|
+
later:later? basic_statement
|
41
|
+
end
|
42
|
+
|
43
|
+
rule later
|
44
|
+
duration ws 'later' ws
|
45
|
+
end
|
46
|
+
|
33
47
|
rule register_stmt
|
34
48
|
'register' ws id ws varname:id
|
35
49
|
end
|
data/lib/ceml/tt/lexer.treetop
CHANGED
@@ -22,10 +22,10 @@ grammar Lexer
|
|
22
22
|
end
|
23
23
|
|
24
24
|
rule number
|
25
|
-
([1-9]+ [0-9]* / '0' / 'an' / 'a' / 'the') {
|
25
|
+
([1-9]+ [0-9]* / '0' / 'an' / 'a' / 'one' / 'the') {
|
26
26
|
def value
|
27
27
|
case text_value
|
28
|
-
when 'a', 'an', 'the' then 1
|
28
|
+
when 'a', 'an', 'the', 'one' then 1
|
29
29
|
else text_value.to_i
|
30
30
|
end
|
31
31
|
end
|
@@ -44,6 +44,16 @@ grammar Lexer
|
|
44
44
|
!(reserved_word ws) [a-zA-Z_]+
|
45
45
|
end
|
46
46
|
|
47
|
+
rule duration
|
48
|
+
number ws? time_unit:('seconds' / 'second' / 's' / 'minutes' / 'minute' / 'min')
|
49
|
+
{
|
50
|
+
def seconds
|
51
|
+
number.text_value.to_f * case time_unit.text_value
|
52
|
+
when /^mi/; 60; else 1; end
|
53
|
+
end
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
47
57
|
rule distance
|
48
58
|
number ws? distance_unit:('miles' / 'mile' / 'mi' / 'km' / 'kilometers' / 'k' / 'meters' / 'm' / 'ft' / 'feet' / 'f' / 'blocks' / 'block')
|
49
59
|
{
|
data/test/helper.rb
CHANGED
data/test/test_incident.rb
CHANGED
@@ -82,6 +82,18 @@ class TestIncident < Test::Unit::TestCase
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
def test_delay
|
86
|
+
s = CEML.parse(:script, "tell agents: hello\n5s later tell agents: goodbye")
|
87
|
+
play s do
|
88
|
+
player :bill, :agent
|
89
|
+
told :bill, /hello/
|
90
|
+
silent :bill
|
91
|
+
sleep 5
|
92
|
+
roll
|
93
|
+
told :bill, /goodbye/
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
85
97
|
def test_signup_1
|
86
98
|
s = CEML.parse(:script, "await 1 new signup\ntell signup: thanks")
|
87
99
|
play do
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 5
|
8
|
-
-
|
9
|
-
version: 0.5.
|
8
|
+
- 6
|
9
|
+
version: 0.5.6
|
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-18 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|