ceml 0.7.13 → 0.8.0

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.
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,49 @@
1
+ module CEML
2
+ module BasicInstruction
3
+
4
+ # TODO: bug right here
5
+ # def role; id.respond_to?(:text_value) && id.text_value.to_sym || :none; end
6
+ def role;
7
+ if id.respond_to?(:text_value)
8
+ id.text_value.to_sym
9
+ else
10
+ raise "holy fuck"
11
+ end
12
+ end
13
+
14
+ def roles
15
+ [role]
16
+ end
17
+
18
+ def text_block
19
+ defined?(:text) && text.text_value
20
+ end
21
+ def var
22
+ return varname.text_value if cmd == :record or cmd == :set or cmd == :release
23
+ (!respond_to?(:about) || about.empty?) ? nil : about.varname.text_value;
24
+ end
25
+ def key; var || text_block; end
26
+ def cmd; text_value.split.first.to_sym; end
27
+ def cond
28
+ (!respond_to?(:condition) || condition.empty?) ? nil : condition.value
29
+ end
30
+
31
+ def bytecode
32
+ code = []
33
+ code.concat case cmd
34
+ when :record; [[roles, :answered_q, {:key => key}]]
35
+ when :set; [[roles, :set, {:key => key, :value => text_block}]]
36
+ when :pick; [[roles, :pick, {:key => key, :value => text_block}]]
37
+ when :ask; [[roles, :ask_q, {:text => text_block, :q => key}],
38
+ [roles, :answered_q, {:key => key}]]
39
+ when :tell; [[roles, :send_msg, {:text => text_block}]]
40
+ when :assign; [[roles, :assign, {:text => text_block}],
41
+ [roles, :complete_assign, {:text => text_block}]]
42
+ when :release; [[roles, :release, {:cond => cond}]]
43
+ when :sync; [[roles, :sync, {:role => role}]]
44
+ end
45
+ code
46
+ end
47
+
48
+ end
49
+ end
@@ -1,28 +1,38 @@
1
1
  module CEML
2
+
2
3
  module CastingStatement
3
4
  extend Forwardable
4
5
  def_delegators :roles, :names, :[], :min
5
6
  alias_method :rolenames, :names
6
7
 
7
- def roles_to_cast(script)
8
- return [] unless type == :await
9
- roles.list.map do |r|
10
- matching = []
11
- matching << matching_text if matching_text
12
- matching += [:city] if radius
13
- c = Criteria.new(r.qualifiers, [], matching, radius, timewindow)
14
- Role.new r.name, c, r.min..r.max, []
8
+ def casting_spec
9
+ return nil unless live_casting?
10
+ matching = []
11
+ matching << matching_text.to_sym if matching_text
12
+ matching += [:city] if radius
13
+ rolespecs = roles.list.map do |r|
14
+ RoleSpec.new(r.name, Tagspec.new(r.qualifiers,[]), r.min..r.max)
15
15
  end
16
+ [type, stanza_name, matching, radius, timewindow, rolespecs]
16
17
  end
17
18
 
18
19
  def type
19
- elements.first.text_value.split.first.to_sym
20
+ elements[1].text_value.split.first.to_sym
21
+ end
22
+
23
+ def live_casting?
24
+ [:await, :accept].include?(type)
20
25
  end
21
26
 
22
27
  def max
23
28
  roles.max
24
29
  end
25
30
 
31
+ def stanza_name
32
+ return nil if stanza_marker.empty?
33
+ stanza_marker and stanza_marker.name and stanza_marker.name.text_value
34
+ end
35
+
26
36
  def within_phrase
27
37
  return if modifiers.empty?
28
38
  modifiers.elements.select{ |m| m.respond_to? :distance }.first
@@ -4,6 +4,11 @@ module CEML
4
4
  [instruction_stmt.basic_statement] + more.elements.map{ |x| x.instruction_stmt.basic_statement }
5
5
  end
6
6
 
7
+ def bytecode
8
+ # p list
9
+ list.map(&:bytecode)
10
+ end
11
+
7
12
  def instructions
8
13
  self
9
14
  end
@@ -16,21 +21,5 @@ module CEML
16
21
  def roles
17
22
  list.map{ |s| s.role.to_sym }.uniq
18
23
  end
19
-
20
- def for(roles)
21
- list.select{ |s| roles.include?(s.role.to_sym) }
22
- end
23
-
24
- def i_asks(roles)
25
- list.select do |s|
26
- s.text_value =~ /^ask/ && roles.include?(s.role.to_sym)
27
- end
28
- end
29
-
30
- def i_tell(roles)
31
- ss = list.select{ |s| s.text_value =~ /^tell/ && roles.include?(s.role.to_sym) }
32
- raise "multiple assignments for role: #{role}" if ss.size > 1
33
- ss.first
34
- end
35
24
  end
36
25
  end
@@ -6,9 +6,10 @@ module CEML
6
6
  # = casting =
7
7
  # ===========
8
8
 
9
- def roles_to_cast
10
- return [] unless cast.type == :await
11
- return cast.roles_to_cast(self)
9
+ def castable
10
+ return nil unless cast.live_casting?
11
+ args = cast.casting_spec + [bytecode]
12
+ Castable.new(*args)
12
13
  end
13
14
 
14
15
  def nabs?
@@ -66,7 +67,7 @@ module CEML
66
67
  DefaultDP = Struct.new :radius, :rolenames, :max, :type
67
68
 
68
69
  def cast
69
- return casting_statement if respond_to? :casting_statement
70
+ return elements.first.casting_statement if elements.first.respond_to? :casting_statement
70
71
  return DefaultDP.new nil, [:agents], 0, :gather
71
72
  end
72
73
 
@@ -87,7 +88,7 @@ module CEML
87
88
  end
88
89
 
89
90
  def allowed_roles
90
- allowed_roles = [:organizer, :agents, :both, :all, :everyone, :each, :players]
91
+ allowed_roles = [:organizer, :agents, :both, :all, :everyone, :each, :players, :them, :either]
91
92
  allowed_roles += cast.rolenames
92
93
  allowed_roles.uniq
93
94
  end
@@ -98,44 +99,42 @@ module CEML
98
99
  # ================
99
100
 
100
101
  def instructions
101
- return self if Instructions === self
102
- return super if defined?(super)
103
- nil
102
+ elements.first.instructions if elements.first.respond_to? :instructions
103
+ # return self if Instructions === self
104
+ # return super if defined?(super)
105
+ # nil
104
106
  end
105
107
 
106
- def instructions_for(roles)
107
- return [] unless instructions
108
- return instructions.for(expand_roles(roles))
108
+ def title
109
+ elements.first.title.title_value if elements.first.respond_to? :title
110
+ # if defined?(super)
111
+ # super.title_value
112
+ # elsif respond_to? :title_value
113
+ # self.title_value
114
+ # else nil
115
+ # end
109
116
  end
110
117
 
118
+
111
119
  def bytecode
112
120
  code = [[[:all], :start]]
121
+ # puts "instructions: #{instructions.inspect}"
113
122
  if !instructions and title
114
123
  code.concat [[[:all], :null_assign], [[:all], :complete_assign]]
115
124
  elsif instructions
116
- instructions.list.each{ |inst| code.concat inst.bytecode } if instructions
125
+ code.concat(instructions.bytecode.flatten(1))
117
126
  end
118
127
  code << [[:all], :finish]
119
128
  code
120
129
  end
121
130
 
122
- def asks(roles)
123
- return [] unless instructions
124
- instructions.i_asks([*roles])
125
- end
126
-
127
- def tell(roles)
128
- return unless instructions
129
- instructions.i_tell([*roles])
130
- end
131
-
132
131
  def validate!
133
- return unless instructions
134
- instructions.validate_instructions!(allowed_roles)
132
+ # return unless instructions
133
+ # instructions.validate_instructions!(allowed_roles)
135
134
  end
136
135
 
137
136
  def concludes_immediately?
138
- !title and instructions.asks([:agents]).empty?
137
+ !title and bytecode.none?{ |line| [:assign, :ask_q].include?(line[1]) }
139
138
  end
140
139
 
141
140
 
@@ -151,33 +150,44 @@ module CEML
151
150
  text_value
152
151
  end
153
152
 
154
- def title
155
- if defined?(super)
156
- super.title_value
157
- elsif respond_to? :title_value
158
- self.title_value
159
- else nil
160
- end
161
- end
162
-
163
153
  def name
164
154
  title || label
165
155
  end
166
156
 
167
157
  def params
168
- asks(:organizer).map do |ask|
169
- [ask.var, ask.var.capitalize, ask.text]
170
- end
158
+ bytecode.map do |line|
159
+ next unless line[0].include?(:organizer)
160
+ next unless line[1] == :ask_q
161
+ [line[2][:q], line[2][:q].capitalize, line[2][:text]]
162
+ end.compact
171
163
  end
172
164
 
173
165
  def type
174
166
  return 'mission' if title
175
167
  return 'unknown' if instructions.empty?
176
- return 'question' if not instructions.asks(:agents).empty?
177
- return 'message' if instructions.tell(:agents)
168
+ return 'question' if simple_question
169
+ return 'message' if simple_message
178
170
  return 'unknown'
179
171
  end
180
172
 
173
+ def simple_message
174
+ # puts "bytecode size: #{bytecode.size}"
175
+ # p bytecode
176
+ return unless bytecode.size == 3
177
+ # puts "bytecode core: #{bytecode[1][1]}"
178
+ return unless bytecode[1][1] == :send_msg
179
+ return bytecode[1][2][:text]
180
+ end
181
+
182
+ def simple_question
183
+ # puts "bytecode size: #{bytecode.size}"
184
+ # p bytecode
185
+ return unless bytecode.size == 4
186
+ # puts "bytecode core: #{bytecode[1][1]}"
187
+ return unless bytecode[1][1] == :ask_q
188
+ return bytecode[1][2][:text]
189
+ end
190
+
181
191
  def message?
182
192
  type == 'message'
183
193
  end
@@ -185,10 +195,10 @@ module CEML
185
195
  def label
186
196
  return title || begin
187
197
  return "unknown" unless simple?
188
- if q = instructions.asks(:agents).first
189
- "Question: #{q.text}"
190
- elsif tell = instructions.tell(:agents)
191
- "Message: #{tell}" if tell
198
+ if simple_question
199
+ "Question: #{simple_question}"
200
+ elsif simple_message
201
+ "Message: #{simple_message}"
192
202
  else
193
203
  "unknown"
194
204
  end