ceml 0.5.0 → 0.5.1

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.0
1
+ 0.5.1
data/ceml.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ceml}
8
- s.version = "0.5.0"
8
+ s.version = "0.5.1"
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"]
@@ -2,7 +2,7 @@ require 'geokit'
2
2
  require "forwardable"
3
3
 
4
4
  module CEML
5
- class Candidate < Struct.new :uid, :tags, :matchables, :lat, :lng
5
+ class Candidate < Struct.new :uid, :tags, :matchables, :lat, :lng, :initial_state
6
6
  include Geokit::Mappable
7
7
  attr_reader :criteria
8
8
 
@@ -37,13 +37,18 @@ module CEML
37
37
 
38
38
  # this method will miss possible castings and does not handle ranges at all
39
39
  def cast
40
- {}.tap do |casting|
40
+ [].tap do |casting|
41
41
  criteria.each do |c|
42
42
  return nil unless folks = hash[c].dup
43
- folks -= casting.keys
43
+ folks -= casting
44
44
  return nil unless folks.size >= c.min_match
45
45
  c.role_counts.each do |role, minct|
46
- folks.shift(minct).each{ |guy| casting[guy.uid] = role.to_sym }
46
+ folks.shift(minct).each do |guy|
47
+ guy.initial_state ||= {}
48
+ guy.initial_state[:id] = guy.uid
49
+ guy.initial_state[:roles] = role.to_sym
50
+ casting << guy
51
+ end
47
52
  end
48
53
  end
49
54
  end
data/lib/ceml/driver.rb CHANGED
@@ -42,16 +42,13 @@ module CEML
42
42
  run incident_id
43
43
  end
44
44
 
45
- # yields a thing with #each and #<<
46
45
  def ping script, candidate
47
46
  LOCATIONS[script] ||= []
48
47
  script.post candidate, LOCATIONS[script]
49
48
  LOCATIONS[script].delete_if do |loc|
50
49
  next unless loc.cast
51
50
  iid = start(script)
52
- loc.cast.each do |k, v|
53
- post iid, :id => k, :roles => v
54
- end
51
+ loc.cast.each{ |guy| post iid, guy.initial_state }
55
52
  end
56
53
  end
57
54
  end
data/lib/ceml/incident.rb CHANGED
@@ -42,6 +42,8 @@ module CEML
42
42
  instrs = script.instructions_for(roles)
43
43
  instrs.each do |inst|
44
44
  case inst.cmd
45
+ when :register
46
+ bytecode << [:answered_q, inst]
45
47
  when :ask
46
48
  bytecode << [:ask_q, inst]
47
49
  bytecode << [:answered_q, inst]
@@ -63,6 +65,7 @@ module CEML
63
65
  end
64
66
 
65
67
  def expand(role, var)
68
+ return (this[:qs_answers]||{})[var] if role =~ /^his|her$/
66
69
  role = nil if role == 'otherguy'
67
70
  role = role.to_sym if role
68
71
  @players.each do |p|
@@ -3,7 +3,7 @@ grammar Instructions
3
3
  include Lexer
4
4
 
5
5
  rule instruction_stmt
6
- (ask_stmt / tell_stmt / assign_stmt) {
6
+ (ask_stmt / tell_stmt / assign_stmt / register_stmt) {
7
7
 
8
8
  INTERPOLATE_REGEX = /\|(\w+)\.?(\w+)?\|/
9
9
 
@@ -17,15 +17,23 @@ grammar Instructions
17
17
 
18
18
  def role; id.text_value.to_sym; end
19
19
  def text; super.text_value; end
20
- def var; (!defined?(:about) || about.empty?) ? nil : about.varname.text_value; end
20
+ def var
21
+ return varname.text_value if cmd == :register
22
+ (!defined?(:about) || about.empty?) ? nil : about.varname.text_value;
23
+ end
21
24
  def key; var || text; end
22
25
  def cmd;
23
26
  text_value =~ /^ask/ and return :ask
24
27
  text_value =~ /^(tell|assign)/ and return :tell
28
+ text_value =~ /^register/ and return :register
25
29
  end
26
30
  }
27
31
  end
28
32
 
33
+ rule register_stmt
34
+ 'register' ws id ws varname:id
35
+ end
36
+
29
37
  rule tell_stmt
30
38
  'tell' ws id ':' ws? text
31
39
  end
data/test/helper.rb CHANGED
@@ -12,6 +12,8 @@ class Test::Unit::TestCase
12
12
  @iid = script && DRIVER.start(script)
13
13
  yield
14
14
  CEML::Driver::JUST_SAID.clear
15
+ CEML::Driver::PLAYERS.clear
16
+ CEML::Driver::INCIDENTS.clear
15
17
  end
16
18
 
17
19
  def ping s, candidate
@@ -19,7 +21,10 @@ class Test::Unit::TestCase
19
21
  end
20
22
 
21
23
  def says id, str
22
- DRIVER.post @iid, :id => id, :received => str
24
+ iid = CEML::Driver::INCIDENTS.keys.find do |iid|
25
+ CEML::Driver::PLAYERS[iid].find{ |p| p[:id] == id }
26
+ end
27
+ DRIVER.post iid, :id => id, :received => str
23
28
  end
24
29
 
25
30
  def player id, *roles
@@ -8,8 +8,80 @@ ask organizer re target: Describe their appearance and location
8
8
  tell agents: Look for |otherguy.target| and compliment them briefly, then move on.
9
9
  XXX
10
10
 
11
+ JANE_SCRIPT = <<XXX
12
+
13
+ await 1 new signup
14
+ register signup first_name
15
+ ask signup re shoeless:
16
+ Hello |his.first_name|. You are Level Zero. Lowly level zero.
17
+ To advance to Level 1, please remove a shoe. Keep it off,
18
+ and text back "shoeless".
19
+ tell signup:
20
+ O ho! Well done |his.first_name|. Now the other players
21
+ know you're in the game, too. But you're still a sad Level 1.
22
+ ask signup re game:
23
+ To advance to Level 2, answer this question. What was your
24
+ favorite game when you were 10 years old? Tell me now.
25
+ tell signup:
26
+ Ah yes. |his.game| WAS an amazing game. You should try to play
27
+ it again--sometime this week, perhaps?
28
+ In the meantime you are but a mere Level 2. Let's see if we can do
29
+ something about that. (You still have your shoe off, right?)
30
+ ask signup re friend:
31
+ While you're texting... Pick someone in your address book you
32
+ haven't talked to in a while. Send them an SMS
33
+ just to say hello. Then tell me their first name.
34
+ tell signup:
35
+ That was awfully nice of you to message |his.friend|
36
+ Welcome to the amazing Level 3. You'll like it here. Stay awhile.
37
+ tell signup:
38
+ Just kidding. Level 4 is way better than this. To get to
39
+ Level 4, wait for an appropriate moment in Jane's talk
40
+ and shout an encouraging "Amen!" Yes. Out loud.
41
+ ask signup re amen:
42
+ If you're not the spiritual type, a forceful "YEAH!" will do.
43
+ When you've accomplished your mission, text me "amen".
44
+ tell signup:
45
+ Wow. I didn't think you had it in you. No one has ever gotten to
46
+ Level 4 before. This is VERY exciting.
47
+ tell signup:
48
+ If you get to Level 5, I'll give you a secret password. Tell it to
49
+ Jane, and you'll get some very fancy loot.
50
+ ask signup re ovation:
51
+ All you have to do is wait until the end of Jane's talk--and try to
52
+ spark a standing ovation. Good luck! Text ovation afterward for your
53
+ password.
54
+ tell signup:
55
+ You did it! You are Level 5. You are AMAZING. The conquering hero of
56
+ the entire audience! Now I can give you your password.
57
+ tell signup:
58
+ Ask Jane to sign a copy of her book to Mr. Gamey McGameful. Of course,
59
+ this will only work if she saw you standing in that ovation. You were
60
+ standing, right?
61
+ XXX
62
+
11
63
  class TestIncident < Test::Unit::TestCase
12
64
 
65
+ def test_jane
66
+ s = CEML.parse(:script, JANE_SCRIPT)
67
+ play do
68
+ c = CEML::Candidate.new('fred', ['new'], {})
69
+ c.initial_state = { :received => 'freddy' }
70
+ ping s, c
71
+ asked 'fred', /Hello freddy. You are Level Zero./
72
+ says 'fred', "shoeless"
73
+ asked 'fred', /favorite game/
74
+ says 'fred', "monopoly"
75
+ asked 'fred', /Pick someone in your address/
76
+ says 'fred', 'jim'
77
+ asked 'fred', /forceful/
78
+ says 'fred', 'okay'
79
+ asked 'fred', /standing ovation/
80
+ says 'fred', 'did it'
81
+ told 'fred', /Gamey/
82
+ end
83
+ end
84
+
13
85
  def test_signup_1
14
86
  s = CEML.parse(:script, "await 1 new signup\ntell signup: thanks")
15
87
  play do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 5
8
- - 0
9
- version: 0.5.0
8
+ - 1
9
+ version: 0.5.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joe Edelman