ceml 0.5.5 → 0.5.6

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