pione 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/History.txt +9 -2
  2. data/Rakefile +1 -1
  3. data/example/Fib/Fib.pione +5 -5
  4. data/example/SequentialProcess/SequentialProcess.pione +69 -0
  5. data/lib/pione.rb +7 -11
  6. data/lib/pione/agent/input-generator.rb +3 -2
  7. data/lib/pione/agent/task-worker.rb +6 -3
  8. data/lib/pione/agent/trivial-routine-worker.rb +6 -5
  9. data/lib/pione/command/basic-command.rb +7 -1
  10. data/lib/pione/command/child-process.rb +5 -1
  11. data/lib/pione/command/front-owner-command.rb +15 -4
  12. data/lib/pione/command/pione-client.rb +16 -9
  13. data/lib/pione/command/pione-syntax-checker.rb +45 -30
  14. data/lib/pione/command/pione-task-worker.rb +22 -13
  15. data/lib/pione/command/pione-tuple-space-provider.rb +4 -2
  16. data/lib/pione/command/pione-tuple-space-receiver.rb +10 -5
  17. data/lib/pione/front/task-worker-owner.rb +1 -0
  18. data/lib/pione/model/basic-model.rb +3 -0
  19. data/lib/pione/model/block.rb +2 -1
  20. data/lib/pione/model/call-rule.rb +10 -0
  21. data/lib/pione/model/feature-expr.rb +143 -54
  22. data/lib/pione/model/float.rb +0 -1
  23. data/lib/pione/model/rule-expr.rb +132 -7
  24. data/lib/pione/model/rule.rb +53 -17
  25. data/lib/pione/model/ticket-expr.rb +124 -0
  26. data/lib/pione/parser/expr-parser.rb +75 -38
  27. data/lib/pione/parser/literal-parser.rb +14 -0
  28. data/lib/pione/parser/parslet-extension.rb +143 -0
  29. data/lib/pione/rule-handler/flow-handler.rb +33 -3
  30. data/lib/pione/system/global.rb +10 -3
  31. data/lib/pione/transformer.rb +24 -0
  32. data/lib/pione/transformer/block-transformer.rb +6 -5
  33. data/lib/pione/transformer/document-transformer.rb +5 -10
  34. data/lib/pione/transformer/expr-transformer.rb +56 -30
  35. data/lib/pione/transformer/feature-expr-transformer.rb +9 -5
  36. data/lib/pione/transformer/flow-element-transformer.rb +21 -23
  37. data/lib/pione/transformer/literal-transformer.rb +39 -35
  38. data/lib/pione/transformer/rule-definition-transformer.rb +8 -6
  39. data/lib/pione/transformer/transformer-module.rb +7 -5
  40. data/lib/pione/tuple/ticket-tuple.rb +8 -0
  41. data/lib/pione/util/{message.rb → console-message.rb} +54 -26
  42. data/lib/pione/version.rb +1 -1
  43. data/pione.gemspec +2 -1
  44. data/test/model/spec_feature-expr.rb +18 -3
  45. data/test/model/spec_feature-expr.yml +28 -16
  46. data/test/model/spec_ticket-expr.rb +67 -0
  47. data/test/parser/spec_expr-parser.yml +74 -25
  48. data/test/parser/spec_literal-parser.yml +11 -0
  49. data/test/test-util.rb +1 -1
  50. data/test/transformer/spec_expr-transformer.rb +27 -54
  51. data/test/transformer/spec_literal-transformer.rb +6 -0
  52. metadata +29 -7
  53. data/lib/pione/parser/syntax-error.rb +0 -61
@@ -1,14 +1,16 @@
1
1
  module Pione
2
2
  module Transformer
3
+ # RuleDefinitionTransformer is a transformer for syntax tree of rule definitions.
3
4
  module RuleDefinitionTransformer
4
5
  include TransformerModule
5
6
 
7
+ # @api private
6
8
  def check_model_type(obj, pione_model_type)
7
9
  pione_model_type.match(obj.pione_mode_type)
8
10
  end
9
11
  module_function :check_model_type
10
12
 
11
- # rule_definition
13
+ # Transform +:rule_definition+ as Model::Rule.
12
14
  rule(:rule_definition => {
13
15
  :rule_header => simple(:rule_expr),
14
16
  :rule_conditions => sequence(:conditions),
@@ -17,7 +19,7 @@ module Pione
17
19
  outputs = Naming::OutputLine.values(conditions)
18
20
  params = Parameters.merge(*Naming::ParamLine.values(conditions))
19
21
  features = Feature::AndExpr.new(*Naming::FeatureLine.values(conditions))
20
- condition = RuleCondition.new(inputs, outputs, params, features)
22
+ condition = RuleCondition.new(inputs, outputs, params, features, TicketExpr.empty, TicketExpr.empty)
21
23
  case block
22
24
  when ActionBlock
23
25
  ActionRule
@@ -26,19 +28,19 @@ module Pione
26
28
  end.new(rule_expr, condition, block)
27
29
  }
28
30
 
29
- # input_line
31
+ # Transform +:input_line+ as Naming::InputLine.
30
32
  rule(:input_line => simple(:data_expr)) {
31
33
  TypeDataExpr.check(data_expr)
32
34
  Naming.InputLine(data_expr)
33
35
  }
34
36
 
35
- # output_line
37
+ # Transform +:output_line+ as Naming::OutputLine.
36
38
  rule(:output_line => simple(:data_expr)) {
37
39
  TypeDataExpr.check(data_expr)
38
40
  Naming.OutputLine(data_expr)
39
41
  }
40
42
 
41
- # param_line
43
+ # Transform +:param_line+ as Naming::ParamLine.
42
44
  rule(:param_line => simple(:param)) {
43
45
  unless TypeAssignment.match(param) or TypeParameters.match(param)
44
46
  raise PioneModelTypeError.new(param, TypeAssignment)
@@ -46,7 +48,7 @@ module Pione
46
48
  Naming.ParamLine(param)
47
49
  }
48
50
 
49
- # feature_line
51
+ # Transform +:feature_line+ as Naming::FeatureLine.
50
52
  rule(:feature_line => simple(:feature)) {
51
53
  TypeFeature.check(feature)
52
54
  Naming.FeatureLine(feature)
@@ -1,7 +1,10 @@
1
1
  module Pione
2
2
  module Transformer
3
+ # TransformerModule enables parslet's transforms to be defined by multiple
4
+ # modules.
3
5
  module TransformerModule
4
6
  class << self
7
+ # @api private
5
8
  def included(mod)
6
9
  singleton = class << mod; self; end
7
10
  create_pair_by(Parslet, Parslet::Transform).each do |name, orig|
@@ -22,15 +25,14 @@ module Pione
22
25
 
23
26
  private
24
27
 
28
+ # Create module and the methods pair by modules.
29
+ #
30
+ # @api private
25
31
  def create_pair_by(*mods)
26
32
  mods.inject([]) do |list, mod|
27
- list += create_pair(mod)
33
+ list + (mod.methods.sort - Object.methods.sort).map{|m| [m, mod]}
28
34
  end
29
35
  end
30
-
31
- def create_pair(mod)
32
- (mod.methods.sort - Object.methods.sort).map{|m| [m, mod]}
33
- end
34
36
  end
35
37
  end
36
38
  end
@@ -0,0 +1,8 @@
1
+ module Pione
2
+ module Tuple
3
+ # TicketTuple is a tuple representation of ticket.
4
+ class TicketTuple < BasicTuple
5
+ define_format [:ticket, :domain, :ticket_name]
6
+ end
7
+ end
8
+ end
@@ -1,13 +1,13 @@
1
1
  module Pione
2
2
  module Util
3
- # Message is a set of utility methods for sending messages to user.
4
- module Message
3
+ # ConsoleMessage is a set of utility methods for sending messages to user.
4
+ module ConsoleMessage
5
5
  # @api private
6
- MessageQueue = Queue.new
6
+ MESSAGE_QUEUE = Queue.new
7
7
 
8
8
  # message queue thread
9
9
  Thread.new {
10
- while msg = MessageQueue.pop
10
+ while msg = MESSAGE_QUEUE.pop
11
11
  puts msg
12
12
  end
13
13
  }
@@ -20,7 +20,8 @@ module Pione
20
20
  # @api private
21
21
  @@quiet_mode = false
22
22
 
23
- # Evaluates the block in debug mode.
23
+ # Evaluate the block in debug mode.
24
+ #
24
25
  # @yield []
25
26
  # target block
26
27
  # @return [void]
@@ -32,7 +33,8 @@ module Pione
32
33
  end
33
34
  module_function :debug_mode
34
35
 
35
- # Sets debug mode.
36
+ # Set debug mode.
37
+ #
36
38
  # @param [bool] mode
37
39
  # flag of debug mode
38
40
  # @return [void]
@@ -42,13 +44,15 @@ module Pione
42
44
  module_function :"debug_mode="
43
45
 
44
46
  # Return true if the system is debug mode.
47
+ #
45
48
  # @return [bool]
46
49
  def debug_mode?
47
50
  @@debug_mode
48
51
  end
49
52
  module_function :debug_mode?
50
53
 
51
- # Evaluates the block in quiet mode.
54
+ # Evaluate the block in quiet mode.
55
+ #
52
56
  # @yield []
53
57
  # target block
54
58
  # @return [void]
@@ -58,9 +62,10 @@ module Pione
58
62
  yield
59
63
  @@quiet_mode = orig
60
64
  end
61
- module_function :debug_mode
65
+ module_function :quiet_mode
62
66
 
63
- # Sets quiet mode.
67
+ # Set quiet mode.
68
+ #
64
69
  # @param [bool] mode
65
70
  # flag of quiet mode
66
71
  # @return [void]
@@ -70,6 +75,7 @@ module Pione
70
75
  module_function :"quiet_mode="
71
76
 
72
77
  # Return true if the system is quiet mode.
78
+ #
73
79
  # @return [bool]
74
80
  def quiet_mode?
75
81
  @@quiet_mode
@@ -78,12 +84,13 @@ module Pione
78
84
 
79
85
  # @!group Message Senders
80
86
 
81
- # Sends the debug message.
82
- # @param [String] msg
87
+ # Send the debug message.
88
+ #
89
+ # @param msg [String]
83
90
  # debug message
84
- # @param [Integer] level
91
+ # @param level [Integer]
85
92
  # indent level
86
- # @param [String] type
93
+ # @param type [String]
87
94
  # message heading type
88
95
  # @return [void]
89
96
  def debug_message(msg, level=0, type="debug")
@@ -93,28 +100,31 @@ module Pione
93
100
  end
94
101
  module_function :debug_message
95
102
 
96
- # Sends the debug message to notify that something begins.
97
- # @param [String] msg
103
+ # Send the debug message to notify that something begins.
104
+ #
105
+ # @param msg [String]
98
106
  # debug message
99
107
  # @return [void]
100
108
  def debug_message_begin(msg)
101
109
  debug_message(msg, 0, ">>>")
102
110
  end
103
111
 
104
- # Sends the debug message to notify that something ends.
105
- # @param [String] msg
112
+ # Send the debug message to notify that something ends.
113
+ #
114
+ # @param msg [String]
106
115
  # debug message
107
116
  # @return [void]
108
117
  def debug_message_end(msg)
109
118
  debug_message(msg, 0, "<<<")
110
119
  end
111
120
 
112
- # Sends the user message.
113
- # @param [String] msg
121
+ # Send the user message.
122
+ #
123
+ # @param msg [String]
114
124
  # user message
115
- # @param [Integer] level
125
+ # @param level [Integer]
116
126
  # indent level
117
- # @param [String] type
127
+ # @param type [String]
118
128
  # message heading type
119
129
  # @return [void]
120
130
  def user_message(msg, level=0, type="info")
@@ -123,15 +133,17 @@ module Pione
123
133
  end
124
134
  end
125
135
 
126
- # Sends the user message to notify that something begins.
127
- # @param [String] msg
136
+ # Send the user message to notify that something begins.
137
+ #
138
+ # @param msg [String]
128
139
  # user message
129
140
  # @return [void]
130
141
  def user_message_begin(msg)
131
142
  user_message(msg, 0, ">>>")
132
143
  end
133
144
 
134
- # Sends the debug message to notify that something ends.
145
+ # Send the debug message to notify that something ends.
146
+ #
135
147
  # @param [String] msg
136
148
  # debug message
137
149
  # @return [void]
@@ -139,15 +151,31 @@ module Pione
139
151
  user_message(msg, 0, "<<<")
140
152
  end
141
153
 
142
- # use this internal debug only
154
+ # Show the message.
155
+ #
156
+ # @param msg [String]
157
+ # the message
158
+ #
159
+ # @note
160
+ # Use this for debugging only.
161
+ #
143
162
  # @api private
144
163
  def show(msg)
145
164
  message("show", :red, msg)
146
165
  end
147
166
 
167
+ # Print the message with the color.
168
+ #
169
+ # @param type [String]
170
+ # message type("debug", "info", "show", ">>>", "<<<")
171
+ # @param color [Symbol]
172
+ # type color(:red, :green, :magenta)
173
+ # @param msg [String]
174
+ # message content
175
+ #
148
176
  # @api private
149
177
  def message(type, color, msg)
150
- MessageQueue.push "%s %s" % [Terminal.color(color, "%5s" % type), msg]
178
+ MESSAGE_QUEUE.push "%s %s" % [Terminal.color(color, "%5s" % type), msg]
151
179
  end
152
180
  module_function :message
153
181
  end
data/lib/pione/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Pione
2
2
  # version of pione
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
data/pione.gemspec CHANGED
@@ -26,9 +26,10 @@ Gem::Specification.new do |gem|
26
26
  #
27
27
 
28
28
  # requisite for system
29
- gem.add_dependency "parslet", "~> 1.4.0"
29
+ gem.add_dependency "parslet", "~> 1.5.0"
30
30
  gem.add_dependency "uuidtools", "~> 2.1.3"
31
31
  gem.add_dependency "highline", "~> 1.6.15"
32
+ gem.add_dependency "hamster", "~> 0.4"
32
33
  gem.add_dependency "naming"
33
34
 
34
35
  # for dropbox resource
@@ -304,11 +304,26 @@ describe 'Feature::Expr' do
304
304
  r.should == Feature::AndExpr.new(requisite)
305
305
  end
306
306
 
307
- testcases.each do |testname, testcase|
307
+ testcases["unification"].each do |type_name, methods|
308
+ methods.each do |method_name, cases|
309
+ cases.each do |case_name, testcase|
310
+ it "should unify %s expression by %s(%s)" % [type_name, method_name, case_name] do
311
+ parser = DocumentParser.new.feature_expr
312
+ expr1 = Transformer.document(parser.parse(testcase["expr1"]))
313
+ expr2 = Transformer.document(parser.parse(testcase["expr2"]))
314
+ result = Transformer.document(parser.parse(testcase["result"]))
315
+ expr1.send(method_name, expr2).should.be.true
316
+ end
317
+ end
318
+ end
319
+ end
320
+
321
+ # sentence test cases
322
+ testcases["sentence"].each do |testname, testcase|
308
323
  it "should get #{testcase["result"]}: #{testname}" do
309
324
  parser = DocumentParser.new.feature_expr
310
- provide = DocumentTransformer.new.apply(parser.parse(testcase["provide"]))
311
- request = DocumentTransformer.new.apply(parser.parse(testcase["request"]))
325
+ provide = Transformer.document(parser.parse(testcase["provide"]))
326
+ request = Transformer.document(parser.parse(testcase["request"]))
312
327
  Feature::Sentence.new(provide, request).decide.should == testcase["result"]
313
328
  end
314
329
  end
@@ -1,16 +1,28 @@
1
- case1:
2
- provide: "^X"
3
- request: "+X"
4
- result: true
5
- case2:
6
- provide: "^X"
7
- request: "*"
8
- result: true
9
- case3:
10
- provide: "^X"
11
- request: "+Y"
12
- result: false
13
- case4:
14
- provide: "^X"
15
- request: "-X"
16
- result: false
1
+ unification:
2
+ AND:
3
+ unify_redundant_feature:
4
+ case1:
5
+ expr1: "+X & +Y"
6
+ expr2: "+X"
7
+ result: "+X & +Y"
8
+ case2:
9
+ expr1: "+X & +Y"
10
+ expr2: "+Y"
11
+ result: "+X & +Y"
12
+ sentence:
13
+ case1:
14
+ provide: "^X"
15
+ request: "+X"
16
+ result: true
17
+ case2:
18
+ provide: "^X"
19
+ request: "*"
20
+ result: true
21
+ case3:
22
+ provide: "^X"
23
+ request: "+Y"
24
+ result: false
25
+ case4:
26
+ provide: "^X"
27
+ request: "-X"
28
+ result: false
@@ -0,0 +1,67 @@
1
+ require_relative '../test-util'
2
+
3
+ describe 'Model::TicketExpr' do
4
+ it 'should get empty ticket expression' do
5
+ TicketExpr.empty.should.empty
6
+ end
7
+
8
+ it 'should equal between same name ticket expressions' do
9
+ TicketExpr.new(["T"]).should == TicketExpr.new(["T"])
10
+ end
11
+
12
+ it 'should not equal' do
13
+ TicketExpr.new(["T"]).should.not == TicketExpr.new(["t"])
14
+ end
15
+
16
+ it 'should get names' do
17
+ TicketExpr.new(["T"]).names.should == Set.new(["T"])
18
+ end
19
+
20
+ it 'should make complex ticket' do
21
+ (TicketExpr.new(["T1"]) + TicketExpr.new(["T2"])).should == TicketExpr.new(["T1", "T2"])
22
+ end
23
+
24
+ describe 'pione method: ==' do
25
+ it 'should true' do
26
+ TicketExpr.new(["T"]).call_pione_method("==", TicketExpr.new(["T"])).should.true
27
+ end
28
+
29
+ it 'should false' do
30
+ TicketExpr.new(["T"]).call_pione_method("==", TicketExpr.new(["t"])).should.not.true
31
+ end
32
+
33
+ it 'should raise type error' do
34
+ should.raise(PioneModelTypeError) do
35
+ TicketExpr.new(["T"]).call_pione_method("==", PioneString.new("T"))
36
+ end
37
+ end
38
+ end
39
+
40
+ describe 'pione method: !=' do
41
+ it 'should true' do
42
+ TicketExpr.new(["T"]).call_pione_method("!=", TicketExpr.new(["t"])).should.true
43
+ end
44
+
45
+ it 'should false' do
46
+ TicketExpr.new(["T"]).call_pione_method("!=", TicketExpr.new(["T"])).should.false
47
+ end
48
+
49
+ it 'should raise type error' do
50
+ should.raise(PioneModelTypeError) do
51
+ TicketExpr.new(["T"]).call_pione_method("==", PioneString.new("T"))
52
+ end
53
+ end
54
+ end
55
+
56
+ describe 'pione method: +' do
57
+ it 'should make complex ticket expression' do
58
+ TicketExpr.new(["T1"]).call_pione_method("+", TicketExpr.new(["T2"]))
59
+ .should == TicketExpr.new(["T1", "T2"])
60
+ end
61
+
62
+ it 'should get itself' do
63
+ TicketExpr.new(["T"]).call_pione_method("+", TicketExpr.new(["T"]))
64
+ .should == TicketExpr.new(["T"])
65
+ end
66
+ end
67
+ end