ceml 0.7.13 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/Makefile +1 -1
  2. data/VERSION +1 -1
  3. data/ceml.gemspec +62 -50
  4. data/guide/guide.html +69 -14
  5. data/guide/guide.md +74 -15
  6. data/guide/guide.pdf +0 -0
  7. data/lib/ceml/driver.rb +0 -181
  8. data/lib/ceml/lang/basic_instruction.rb +49 -0
  9. data/lib/ceml/{casting_statement.rb → lang/casting_statement.rb} +19 -9
  10. data/lib/ceml/{instruction_statements.rb → lang/instruction_statements.rb} +5 -16
  11. data/lib/ceml/{script.rb → lang/script.rb} +53 -43
  12. data/lib/ceml/lang/tt/casting.rb +432 -0
  13. data/lib/ceml/lang/tt/casting.treetop +29 -0
  14. data/lib/ceml/lang/tt/instructions.rb +1130 -0
  15. data/lib/ceml/lang/tt/instructions.treetop +86 -0
  16. data/lib/ceml/lang/tt/lexer.rb +1804 -0
  17. data/lib/ceml/{tt → lang/tt}/lexer.treetop +70 -7
  18. data/lib/ceml/lang/tt/scripts.rb +647 -0
  19. data/lib/ceml/{tt → lang/tt}/scripts.treetop +2 -2
  20. data/lib/ceml/lang.rb +10 -0
  21. data/lib/ceml/models/audition.rb +65 -0
  22. data/lib/ceml/models/bundle.rb +64 -0
  23. data/lib/ceml/models/cast.rb +108 -0
  24. data/lib/ceml/models/castable.rb +81 -0
  25. data/lib/ceml/{incident.rb → models/incident.rb} +63 -15
  26. data/lib/ceml/models/incident_model.rb +100 -0
  27. data/lib/ceml/models/incident_role_slot.rb +16 -0
  28. data/lib/ceml/models/player.rb +80 -0
  29. data/lib/ceml/models/queue.rb +12 -0
  30. data/lib/ceml/models/waiting_room.rb +40 -0
  31. data/lib/ceml/models.rb +16 -0
  32. data/lib/ceml/processor.rb +162 -0
  33. data/lib/ceml.rb +7 -14
  34. data/test/askchain.ceml +6 -0
  35. data/test/compliment.ceml +4 -0
  36. data/test/dialogues/accept.ceml +24 -0
  37. data/test/dialogues/basic_seed.ceml +26 -0
  38. data/test/dialogues/jordan.ceml +121 -0
  39. data/test/helper.rb +44 -39
  40. data/test/jane.ceml +48 -0
  41. data/test/{test_casting.rb → lang/test_casting.rb} +5 -0
  42. data/test/lang/test_instructions.rb +42 -0
  43. data/test/{test_scripts.rb → lang/test_scripts.rb} +3 -2
  44. data/test/sync.ceml +6 -0
  45. data/test/test_castable.rb +20 -0
  46. data/test/test_dialogues.rb +58 -0
  47. data/test/test_incident.rb +64 -127
  48. metadata +54 -30
  49. data/.gitignore +0 -23
  50. data/lib/ceml/confluence.rb +0 -63
  51. data/lib/ceml/role.rb +0 -61
  52. data/lib/ceml/tt/casting.treetop +0 -65
  53. data/lib/ceml/tt/instructions.treetop +0 -91
  54. data/test/test_instructions.rb +0 -27
  55. data/test/test_release.rb +0 -78
@@ -0,0 +1,58 @@
1
+ require 'ceml'
2
+ require 'test/helper'
3
+ require 'set'
4
+
5
+ class TestCemlTests < Test::Unit::TestCase
6
+
7
+ def setup
8
+ CEML::Queue.new.calls.clear
9
+ end
10
+
11
+ def test_cemltests
12
+ Dir["test/dialogues/*.ceml"].each do |f|
13
+ name = File.basename(f, '.ceml')
14
+ test = File.new(f).read
15
+ scripts, test = test.split("\n---\n")
16
+
17
+ puts "Running cemltest #{name}..."
18
+
19
+ s = CEML.parse(:scripts, scripts).map(&:castable)
20
+ bundle_id = s.hash.to_s
21
+ CEML::Processor.set_bundle(bundle_id, s)
22
+ CEML::Processor.reset_bundle(bundle_id)
23
+ pl = Set.new
24
+ play do
25
+ test.each_line do |line|
26
+ puts ">>>> #{line}"
27
+ case line.strip
28
+ when /^(\w+) *< *(.*)$/
29
+ if $2.empty?
30
+ silent $1
31
+ else
32
+ told $1, /#{$2}/
33
+ end
34
+ when /^(\w+) *> *(.*)$/
35
+ player_id, msg = $1, $2
36
+ player = {:id => player_id, :received => msg }
37
+ if !pl.include?(player_id)
38
+ player[:tags] = ['new']
39
+ pl << player_id
40
+ end
41
+ player[:recognized] = :yes if msg == 'y' || msg =~ /^yes/i
42
+ player[:recognized] = :abort if msg == 'abort'
43
+ player[:recognized] = :done if msg =~ /^done/i || msg == 'd'
44
+ CEML::Processor.ping(bundle_id, player)
45
+ CEML::Processor.run
46
+ when /^\((\d+)\s*(\w+)\)$/
47
+ CEML.incr_clock CEML.dur($1.to_i, $2)
48
+ CEML::Processor.run_latest
49
+ CEML::Processor.run
50
+ when /^#/
51
+ else "Skipping line #{line}..."
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ end
@@ -1,93 +1,29 @@
1
1
  require 'ceml'
2
2
  require 'test/helper'
3
3
 
4
- SYNC_SCRIPT = <<XXX
5
- await 1 alpha and 1 beta
6
- ask alpha re color: What color?
7
- ask beta re color: What color?
8
- sync both
9
- tell alpha: Hi there
10
- tell beta: Goodbye
11
- XXX
12
-
13
- COMPLIMENT_SCRIPT = <<XXX
14
- "Overwhelm a specific person with compliments"
15
- gather 5-20 players within 4 blocks
16
- ask organizer re target: Describe their appearance and location
17
- tell agents: Look for |somebody.target| and compliment them briefly, then move on.
18
- XXX
19
-
20
- JANE_SCRIPT = <<XXX
21
-
22
- await 1 new signup
23
- record signup first_name
24
- ask signup re shoeless:
25
- Hello |his.first_name|. You are Level Zero. Lowly level zero.
26
- To advance to Level 1, please remove a shoe. Keep it off,
27
- and text back "shoeless".
28
- tell signup:
29
- O ho! Well done |his.first_name|. Now the other players
30
- know you're in the game, too. But you're still a sad Level 1.
31
- ask signup re game:
32
- To advance to Level 2, answer this question. What was your
33
- favorite game when you were 10 years old? Tell me now.
34
- tell signup:
35
- Ah yes. |his.game| WAS an amazing game. You should try to play
36
- it again--sometime this week, perhaps?
37
- In the meantime you are but a mere Level 2. Let's see if we can do
38
- something about that. (You still have your shoe off, right?)
39
- ask signup re friend:
40
- While you're texting... Pick someone in your address book you
41
- haven't talked to in a while. Send them an SMS
42
- just to say hello. Then tell me their first name.
43
- tell signup:
44
- That was awfully nice of you to message |his.friend|
45
- Welcome to the amazing Level 3. You'll like it here. Stay awhile.
46
- tell signup:
47
- Just kidding. Level 4 is way better than this. To get to
48
- Level 4, wait for an appropriate moment in Jane's talk
49
- and shout an encouraging "Amen!" Yes. Out loud.
50
- ask signup re amen:
51
- If you're not the spiritual type, a forceful "YEAH!" will do.
52
- When you've accomplished your mission, text me "amen".
53
- tell signup:
54
- Wow. I didn't think you had it in you. No one has ever gotten to
55
- Level 4 before. This is VERY exciting.
56
- tell signup:
57
- If you get to Level 5, I'll give you a secret password. Tell it to
58
- Jane, and you'll get some very fancy loot.
59
- ask signup re ovation:
60
- All you have to do is wait until the end of Jane's talk--and try to
61
- spark a standing ovation. Good luck! Text ovation afterward for your
62
- password.
63
- tell signup:
64
- You did it! You are Level 5. You are AMAZING. The conquering hero of
65
- the entire audience! Now I can give you your password.
66
- tell signup:
67
- Ask Jane to sign a copy of her book to Mr. Gamey McGameful. Of course,
68
- this will only work if she saw you standing in that ovation. You were
69
- standing, right?
70
- XXX
71
-
72
4
  class TestIncident < Test::Unit::TestCase
73
5
 
6
+ def setup
7
+ CEML::Queue.new.calls.clear
8
+ end
9
+
74
10
  def test_sync
75
- s = scriptfam SYNC_SCRIPT
11
+ s = scriptfam SCRIPTS['sync']
76
12
  play do
77
- ping s, :id => 'alpha'
78
- ping s, :id => 'beta'
13
+ ping s, :id => 'alpha', :tags => ['new']
14
+ ping s, :id => 'beta', :tags => ['new']
79
15
  asked 'alpha', /olor/
80
16
  asked 'beta', /olor/
81
17
  says 'alpha', "red"
82
18
  silent 'alpha'
83
19
  says 'beta', "blue"
84
- told 'alpha', /Hi/
85
- told 'beta', /Goodbye/
20
+ told 'beta', /Hi/
21
+ told 'alpha', /Goodbye/
86
22
  end
87
23
  end
88
24
 
89
25
  def test_jane
90
- s = scriptfam JANE_SCRIPT
26
+ s = scriptfam SCRIPTS['jane']
91
27
  play do
92
28
  ping s, :id => 'fred', :tags => ['new'], :received => 'freddy'
93
29
  asked 'fred', /Hello freddy. You are Level Zero./
@@ -128,42 +64,40 @@ class TestIncident < Test::Unit::TestCase
128
64
  s = scriptfam "await 2 new signups\ntell signups: thanks"
129
65
  play do
130
66
  ping s, :id => 'fred', :tags => ['new']
131
- silent 'fred'
132
- ping s, :id => 'wilma', :tags => ['old']
133
- silent 'fred'
134
- ping s, :id => 'betty', :tags => ['new']
67
+ # silent 'fred'
68
+ # ping s, :id => 'wilma', :tags => ['old']
69
+ # silent 'fred'
70
+ # ping s, :id => 'betty', :tags => ['new']
135
71
  told 'fred', /thanks/
136
72
  end
137
73
  end
138
74
 
139
75
 
140
- def test_inside_timewindow
141
- s = scriptfam "await 2 new signups over 10s\ntell signups: thanks"
142
- play do
143
- ping s, :id => 'fred', :tags => ['new']
144
- silent 'fred'
145
- CEML.incr_clock 5
146
- ping s, :id => 'betty', :tags => ['new']
147
- told 'fred', /thanks/
148
- end
149
- end
150
-
151
- def test_outside_timewindow
152
- s = scriptfam "await 2 new signups over 10s\ntell signups: thanks"
153
- play do
154
- ping s, :id => 'fred', :tags => ['new']
155
- silent 'fred'
156
- CEML.incr_clock 15
157
- ping s, :id => 'betty', :tags => ['new']
158
- silent 'fred'
159
- end
160
- end
76
+ # def test_inside_timewindow
77
+ # s = scriptfam "await 2 new signups over 10s\ntell signups: thanks"
78
+ # play do
79
+ # ping s, :id => 'fred', :tags => ['new']
80
+ # silent 'fred'
81
+ # CEML.incr_clock 5
82
+ # ping s, :id => 'betty', :tags => ['new']
83
+ # told 'fred', /thanks/
84
+ # end
85
+ # end
86
+ #
87
+ # def test_outside_timewindow
88
+ # s = scriptfam "await 2 new signups over 10s\ntell signups: thanks"
89
+ # play do
90
+ # ping s, :id => 'fred', :tags => ['new']
91
+ # silent 'fred'
92
+ # CEML.incr_clock 15
93
+ # ping s, :id => 'betty', :tags => ['new']
94
+ # silent 'fred'
95
+ # end
96
+ # end
161
97
 
162
98
  def test_interpolation
163
99
  s = "\"Soccer in the park\"\ngather 2 players within 1mi\nask players re color: which color?\ntell players: its |someone.color|\n"
164
100
  s = CEML.parse(:script, s)
165
- instrs = s.instructions_for(s.roles)
166
- assert !instrs.empty?
167
101
  play s do
168
102
  player :bill, :players
169
103
  player :fred, :players
@@ -176,23 +110,36 @@ class TestIncident < Test::Unit::TestCase
176
110
  end
177
111
  end
178
112
 
113
+ def test_abort
114
+ s = "\"Soccer in the park\"\ngather 2 players within 1mi\nask players re color: which color?\ntell players: its |someone.color|\n"
115
+ s = CEML.parse(:script, s)
116
+ play s do
117
+ player :bill, :players
118
+ player :fred, :players
119
+ asked :bill, /color\?/i
120
+ asked :fred, /color\?/i
121
+ says :bill, 'abort'
122
+ told :bill, /aborted/i
123
+ end
124
+ end
125
+
179
126
  def test_await
180
- s = scriptfam "await a,b,c\ntell a: foo\ntell b: bar\ntell c: baz"
127
+ s = scriptfam "await new a, new b, new c\ntell a: foo\ntell b: bar\ntell c: baz"
181
128
  play do
182
- ping s, :id => 'fred'
129
+ ping s, :id => 'fred', :tags => ['new']
183
130
  silent 'fred'
184
- ping s, :id => 'wilma'
131
+ ping s, :id => 'wilma', :tags => ['new']
185
132
  silent 'fred'
186
133
  silent 'wilma'
187
- ping s, :id => 'betty'
134
+ ping s, :id => 'betty', :tags => ['new']
188
135
  told 'fred', /foo/
189
136
  told 'betty', /baz/
190
137
  end
191
138
  end
192
139
 
193
140
  def test_incident
194
- play COMPLIMENT_SCRIPT do
195
- player :joe, :organizer, :agent
141
+ play SCRIPTS['compliment'] do
142
+ player :joe, :organizer
196
143
  player :bill, :agent
197
144
 
198
145
  asked :joe, /^Describe/
@@ -202,27 +149,17 @@ class TestIncident < Test::Unit::TestCase
202
149
  end
203
150
  end
204
151
 
205
- ASKCHAIN_SCRIPT = <<XXX
206
- "Meet your neighbor"
207
- gather 2 players within 1 block
208
- ask players re color: what's your favorite color?
209
- ask players re observation: find someone near you with the color |somebody.color|. what are they wearing?
210
- ask players re rightmatch: are you wearing |somebody.observation|?
211
- ask players re task: take your new partner and see if you can find something beautiful in the park.
212
- XXX
213
-
214
-
215
152
  def test_askchain
216
- play ASKCHAIN_SCRIPT do
217
- player :joe, :players, :agent
218
- player :bill, :players, :agent
219
-
220
- asked :joe, /favorite color/
221
- asked :bill, /favorite color/
222
- says :joe, "red"
223
- says :bill, "green"
224
- asked :joe, /with the color green/
225
- asked :bill, /with the color red/
153
+ play SCRIPTS['askchain'] do
154
+ player :joey, :players
155
+ player :billy, :players
156
+
157
+ asked :joey, /favorite color/
158
+ asked :billy, /favorite color/
159
+ says :joey, "red"
160
+ says :billy, "green"
161
+ asked :joey, /with the color green/
162
+ asked :billy, /with the color red/
226
163
  end
227
164
  end
228
165
 
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ceml
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 63
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
- - 7
8
- - 13
9
- version: 0.7.13
8
+ - 8
9
+ - 0
10
+ version: 0.8.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Joe Edelman
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-02-24 00:00:00 -08:00
18
+ date: 2011-05-27 00:00:00 -07:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: treetop
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
@@ -40,7 +43,6 @@ extra_rdoc_files:
40
43
  - README.markdown
41
44
  files:
42
45
  - .document
43
- - .gitignore
44
46
  - LICENSE
45
47
  - Makefile
46
48
  - README.markdown
@@ -56,58 +58,80 @@ files:
56
58
  - guide/guide.md
57
59
  - guide/guide.pdf
58
60
  - lib/ceml.rb
59
- - lib/ceml/casting_statement.rb
60
- - lib/ceml/confluence.rb
61
61
  - lib/ceml/driver.rb
62
- - lib/ceml/incident.rb
63
- - lib/ceml/instruction_statements.rb
64
- - lib/ceml/role.rb
65
- - lib/ceml/script.rb
66
- - lib/ceml/tt/casting.treetop
67
- - lib/ceml/tt/instructions.treetop
68
- - lib/ceml/tt/lexer.treetop
69
- - lib/ceml/tt/scripts.treetop
62
+ - lib/ceml/lang.rb
63
+ - lib/ceml/lang/basic_instruction.rb
64
+ - lib/ceml/lang/casting_statement.rb
65
+ - lib/ceml/lang/instruction_statements.rb
66
+ - lib/ceml/lang/script.rb
67
+ - lib/ceml/lang/tt/casting.rb
68
+ - lib/ceml/lang/tt/casting.treetop
69
+ - lib/ceml/lang/tt/instructions.rb
70
+ - lib/ceml/lang/tt/instructions.treetop
71
+ - lib/ceml/lang/tt/lexer.rb
72
+ - lib/ceml/lang/tt/lexer.treetop
73
+ - lib/ceml/lang/tt/scripts.rb
74
+ - lib/ceml/lang/tt/scripts.treetop
75
+ - lib/ceml/models.rb
76
+ - lib/ceml/models/audition.rb
77
+ - lib/ceml/models/bundle.rb
78
+ - lib/ceml/models/cast.rb
79
+ - lib/ceml/models/castable.rb
80
+ - lib/ceml/models/incident.rb
81
+ - lib/ceml/models/incident_model.rb
82
+ - lib/ceml/models/incident_role_slot.rb
83
+ - lib/ceml/models/player.rb
84
+ - lib/ceml/models/queue.rb
85
+ - lib/ceml/models/waiting_room.rb
86
+ - lib/ceml/processor.rb
87
+ - test/askchain.ceml
88
+ - test/compliment.ceml
89
+ - test/dialogues/accept.ceml
90
+ - test/dialogues/basic_seed.ceml
91
+ - test/dialogues/jordan.ceml
70
92
  - test/helper.rb
71
- - test/test_casting.rb
93
+ - test/jane.ceml
94
+ - test/lang/test_casting.rb
95
+ - test/lang/test_instructions.rb
96
+ - test/lang/test_scripts.rb
97
+ - test/sync.ceml
98
+ - test/test_castable.rb
99
+ - test/test_dialogues.rb
72
100
  - test/test_incident.rb
73
- - test/test_instructions.rb
74
- - test/test_release.rb
75
- - test/test_scripts.rb
76
101
  - try
77
102
  has_rdoc: true
78
103
  homepage: http://github.com/citizenlogistics/ceml
79
104
  licenses: []
80
105
 
81
106
  post_install_message:
82
- rdoc_options:
83
- - --charset=UTF-8
107
+ rdoc_options: []
108
+
84
109
  require_paths:
85
110
  - lib
86
111
  required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
87
113
  requirements:
88
114
  - - ">="
89
115
  - !ruby/object:Gem::Version
116
+ hash: 3
90
117
  segments:
91
118
  - 0
92
119
  version: "0"
93
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
+ none: false
94
122
  requirements:
95
123
  - - ">="
96
124
  - !ruby/object:Gem::Version
125
+ hash: 3
97
126
  segments:
98
127
  - 0
99
128
  version: "0"
100
129
  requirements: []
101
130
 
102
131
  rubyforge_project:
103
- rubygems_version: 1.3.6
132
+ rubygems_version: 1.6.2
104
133
  signing_key:
105
134
  specification_version: 3
106
135
  summary: a language for coordinating real world events
107
- test_files:
108
- - test/helper.rb
109
- - test/test_casting.rb
110
- - test/test_incident.rb
111
- - test/test_instructions.rb
112
- - test/test_release.rb
113
- - test/test_scripts.rb
136
+ test_files: []
137
+
data/.gitignore DELETED
@@ -1,23 +0,0 @@
1
- lib/ceml/tt/*.rb
2
-
3
- ## MAC OS
4
- .DS_Store
5
-
6
- ## TEXTMATE
7
- *.tmproj
8
- tmtags
9
-
10
- ## EMACS
11
- *~
12
- \#*
13
- .\#*
14
-
15
- ## VIM
16
- *.swp
17
-
18
- ## PROJECT::GENERAL
19
- coverage
20
- rdoc
21
- pkg
22
-
23
- ## PROJECT::SPECIFIC
@@ -1,63 +0,0 @@
1
- require 'geokit'
2
- require 'forwardable'
3
-
4
- module CEML
5
- class Confluence
6
- attr_accessor :hash, :created, :roles_to_cast, :incident_id, :star
7
- alias_method :launched?, :incident_id
8
-
9
- def initialize roles_to_cast, candidate = nil
10
- @hash = {}
11
- @created = true
12
- @roles_to_cast = roles_to_cast
13
- push candidate if candidate
14
- end
15
-
16
- def rm *candidates
17
- @roles_to_cast.each{ |role| role.rm *candidates }
18
- end
19
-
20
- def best_role_for candidate
21
- # puts "confluence finding best role #{object_id} #{candidate[:id]} #{star}"
22
- winner = @roles_to_cast.max_by{ |role| role.affinity(candidate, star) }
23
- winner unless winner.affinity(candidate, star)[0] == -1
24
- end
25
-
26
- def stage_with_candidate candidate
27
- return :uninterested if cast_with?(candidate)
28
- best_role = best_role_for(candidate)
29
- return :uninterested unless best_role
30
- return :joinable if launched?
31
- other_roles = @roles_to_cast - [best_role]
32
- return :launchable if best_role.one_left? and other_roles.all?(&:filled?)
33
- return :listable
34
- end
35
-
36
- def push candidate
37
- best_role = best_role_for(candidate)
38
- candidate[:roles] = best_role.name.to_sym
39
- best_role.casted << candidate
40
- @star ||= candidate
41
- end
42
-
43
- def full?
44
- @roles_to_cast.all?{ |role| role.allowed == 0 }
45
- end
46
-
47
- def over?
48
- @roles_to_cast.any?{ |r| r.over?(star) }
49
- end
50
-
51
- def cast_with?(candidate)
52
- @roles_to_cast.any?{ |r| r.casted.any?{ |guy| guy[:id] == candidate[:id] } }
53
- end
54
-
55
- def live_with?(candidate)
56
- launched? and cast_with?(candidate)
57
- end
58
-
59
- def cast
60
- @roles_to_cast.map{ |r| r.casted }.flatten
61
- end
62
- end
63
- end
data/lib/ceml/role.rb DELETED
@@ -1,61 +0,0 @@
1
- module CEML
2
-
3
- class Criteria < Struct.new :plus_tags, :minus_tags, :matching, :radius, :timewindow
4
- def complexity; plus_tags.size; end
5
- def =~(candidate)
6
- candidate[:tags] ||= []
7
- (plus_tags - candidate[:tags]).empty? and (minus_tags & candidate[:tags]).empty?
8
- end
9
- end
10
-
11
- class Role < Struct.new :name, :criteria, :range, :casted
12
- # def <=>(b); b.criteria.complexity <=> criteria.complexity; end
13
- def affinity candidate, star
14
- return [-1, -1, -1 ] unless fits?(candidate, star)
15
- [ criteria.complexity, -needed, -allowed ]
16
- end
17
-
18
- def comparable_object
19
- [name, criteria, range]
20
- end
21
-
22
- def ==(other); comparable_object == other.comparable_object; end
23
- def hash; comparable_object.hash; end
24
-
25
- def filled?; needed == 0; end
26
- def one_left?; needed == 1; end
27
-
28
- def rm(*ids); casted.delete_if{ |guy| ids.include? guy[:id] }; end
29
- def needed; [range.min - casted.size, 0].max; end
30
- def allowed; [range.max - casted.size, 0].max; end
31
-
32
- def over?(star)
33
- return unless criteria.timewindow and star
34
- CEML.clock - star[:ts] > criteria.timewindow
35
- end
36
-
37
- def fits?(candidate, star = nil)
38
- return false unless criteria =~ candidate
39
- return false if casted.size >= range.max
40
- return false if casted.any?{ |guy| guy[:id] == candidate[:id] }
41
- return true unless star
42
- c = criteria
43
- if c.matching
44
- return unless c.matching.all? do |g|
45
- candidate[:matchables][g] && star[:matchables][g] &&
46
- candidate[:matchables][g].downcase.strip == star[:matchables][g].downcase.strip
47
- end
48
- end
49
- if c.radius
50
- c_ll = Geokit::LatLng(candidate[:lat], candidate[:lng])
51
- s_ll = Geokit::LatLng(star[:lat], star[:lng])
52
- return unless c_ll.distance_to(s_ll, :meters) <= c.radius
53
- end
54
- if c.timewindow
55
- # puts "checking timewindow #{c.timewindow} #{candidate[:ts] - star[:ts]}"
56
- return unless candidate[:ts] - star[:ts] <= c.timewindow
57
- end
58
- return true
59
- end
60
- end
61
- end
@@ -1,65 +0,0 @@
1
- module CEML
2
- grammar Casting
3
- include Lexer
4
-
5
- rule casting_statement
6
- ('gather' / 'await' / 'nab') ws roles modifiers:modifier_phrase* <CastingStatement>
7
- end
8
-
9
- rule modifier_phrase
10
- over_phrase / within_phrase / with_matching_phrase
11
- end
12
-
13
- rule over_phrase
14
- ws 'over' ws duration
15
- end
16
-
17
- rule within_phrase
18
- ws 'within' ws distance
19
- end
20
-
21
- rule with_matching_phrase
22
- ws 'with' ws 'matching' ws thing:id
23
- end
24
-
25
- rule roles
26
- role more:(and role)* {
27
- def list
28
- [role] + more.elements.map{ |e| e.role }
29
- end
30
-
31
- def names; list.map{ |r| r.name.to_sym }; end
32
- def [](x); list.detect{ |r| r.name.to_sym == x }; end
33
- def min; list.map(&:min).inject(0, &:+); end
34
- def max; list.map(&:max).inject(0, &:+); end
35
- }
36
- end
37
-
38
- rule qualifier
39
- id
40
- end
41
-
42
- rule rolename
43
- id
44
- end
45
-
46
- rule role
47
- (rolename &and / range ws qualifier ws rolename / range ws rolename / qualifier ws rolename / rolename) {
48
- def name; if respond_to? :rolename then rolename.text_value else text_value end; end
49
- def min
50
- return range.value.min if respond_to? :range
51
- name =~ /s$/ ? 2 : 1
52
- end
53
- def max
54
- return range.value.max if respond_to? :range
55
- name =~ /s$/ ? 10000 : 1
56
- end
57
- def qualifiers
58
- return [qualifier.text_value] if respond_to? :qualifier
59
- return []
60
- end
61
- }
62
- end
63
-
64
- end
65
- end