pione 0.1.1 → 0.1.2

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 (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