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 CHANGED
@@ -1 +1 @@
1
- 0.5.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.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-17}
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
- player_id = player[:id]
47
- player[:roles] = Set.new([*player[:roles] || []])
48
- player[:roles] << :agents
49
- if existing_player = players.find{ |p| p[:id] == player_id }
50
- existing_player[:roles] += player.delete :roles
51
- existing_player.update player
52
- else
53
- players << player
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 run(incident, players)
65
- incident.run(players) do |player, meth, what|
66
- meth = "player_#{meth}"
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
- # roles.include? :agent or return false
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
@@ -1,7 +1,7 @@
1
1
  module CEML
2
2
  module InstructionStatements
3
3
  def list
4
- [instruction_stmt] + more.elements.map(&:instruction_stmt)
4
+ [instruction_stmt.basic_statement] + more.elements.map{ |x| x.instruction_stmt.basic_statement }
5
5
  end
6
6
 
7
7
  def instructions
@@ -2,7 +2,7 @@ module CEML
2
2
  grammar Instructions
3
3
  include Lexer
4
4
 
5
- rule instruction_stmt
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/ and return :ask
32
+ text_value =~ /^ask/ and return :ask
27
33
  text_value =~ /^(tell|assign)/ and return :tell
28
- text_value =~ /^register/ and return :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
@@ -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
@@ -31,6 +31,10 @@ class Test::Unit::TestCase
31
31
  DRIVER.post @iid, :id => id, :roles => roles
32
32
  end
33
33
 
34
+ def roll
35
+ DRIVER.post @iid
36
+ end
37
+
34
38
  def asked id, rx
35
39
  assert p = CEML::Driver::JUST_SAID[id]
36
40
  assert_equal :ask, p[:said]
@@ -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
- - 5
9
- version: 0.5.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 00:00:00 -08:00
17
+ date: 2011-01-18 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency