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.
- data/History.txt +9 -2
- data/Rakefile +1 -1
- data/example/Fib/Fib.pione +5 -5
- data/example/SequentialProcess/SequentialProcess.pione +69 -0
- data/lib/pione.rb +7 -11
- data/lib/pione/agent/input-generator.rb +3 -2
- data/lib/pione/agent/task-worker.rb +6 -3
- data/lib/pione/agent/trivial-routine-worker.rb +6 -5
- data/lib/pione/command/basic-command.rb +7 -1
- data/lib/pione/command/child-process.rb +5 -1
- data/lib/pione/command/front-owner-command.rb +15 -4
- data/lib/pione/command/pione-client.rb +16 -9
- data/lib/pione/command/pione-syntax-checker.rb +45 -30
- data/lib/pione/command/pione-task-worker.rb +22 -13
- data/lib/pione/command/pione-tuple-space-provider.rb +4 -2
- data/lib/pione/command/pione-tuple-space-receiver.rb +10 -5
- data/lib/pione/front/task-worker-owner.rb +1 -0
- data/lib/pione/model/basic-model.rb +3 -0
- data/lib/pione/model/block.rb +2 -1
- data/lib/pione/model/call-rule.rb +10 -0
- data/lib/pione/model/feature-expr.rb +143 -54
- data/lib/pione/model/float.rb +0 -1
- data/lib/pione/model/rule-expr.rb +132 -7
- data/lib/pione/model/rule.rb +53 -17
- data/lib/pione/model/ticket-expr.rb +124 -0
- data/lib/pione/parser/expr-parser.rb +75 -38
- data/lib/pione/parser/literal-parser.rb +14 -0
- data/lib/pione/parser/parslet-extension.rb +143 -0
- data/lib/pione/rule-handler/flow-handler.rb +33 -3
- data/lib/pione/system/global.rb +10 -3
- data/lib/pione/transformer.rb +24 -0
- data/lib/pione/transformer/block-transformer.rb +6 -5
- data/lib/pione/transformer/document-transformer.rb +5 -10
- data/lib/pione/transformer/expr-transformer.rb +56 -30
- data/lib/pione/transformer/feature-expr-transformer.rb +9 -5
- data/lib/pione/transformer/flow-element-transformer.rb +21 -23
- data/lib/pione/transformer/literal-transformer.rb +39 -35
- data/lib/pione/transformer/rule-definition-transformer.rb +8 -6
- data/lib/pione/transformer/transformer-module.rb +7 -5
- data/lib/pione/tuple/ticket-tuple.rb +8 -0
- data/lib/pione/util/{message.rb → console-message.rb} +54 -26
- data/lib/pione/version.rb +1 -1
- data/pione.gemspec +2 -1
- data/test/model/spec_feature-expr.rb +18 -3
- data/test/model/spec_feature-expr.yml +28 -16
- data/test/model/spec_ticket-expr.rb +67 -0
- data/test/parser/spec_expr-parser.yml +74 -25
- data/test/parser/spec_literal-parser.yml +11 -0
- data/test/test-util.rb +1 -1
- data/test/transformer/spec_expr-transformer.rb +27 -54
- data/test/transformer/spec_literal-transformer.rb +6 -0
- metadata +29 -7
- 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
|
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
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module Pione
|
2
2
|
module Util
|
3
|
-
#
|
4
|
-
module
|
3
|
+
# ConsoleMessage is a set of utility methods for sending messages to user.
|
4
|
+
module ConsoleMessage
|
5
5
|
# @api private
|
6
|
-
|
6
|
+
MESSAGE_QUEUE = Queue.new
|
7
7
|
|
8
8
|
# message queue thread
|
9
9
|
Thread.new {
|
10
|
-
while msg =
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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 :
|
65
|
+
module_function :quiet_mode
|
62
66
|
|
63
|
-
#
|
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
|
-
#
|
82
|
-
#
|
87
|
+
# Send the debug message.
|
88
|
+
#
|
89
|
+
# @param msg [String]
|
83
90
|
# debug message
|
84
|
-
# @param [Integer]
|
91
|
+
# @param level [Integer]
|
85
92
|
# indent level
|
86
|
-
# @param [String]
|
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
|
-
#
|
97
|
-
#
|
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
|
-
#
|
105
|
-
#
|
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
|
-
#
|
113
|
-
#
|
121
|
+
# Send the user message.
|
122
|
+
#
|
123
|
+
# @param msg [String]
|
114
124
|
# user message
|
115
|
-
# @param [Integer]
|
125
|
+
# @param level [Integer]
|
116
126
|
# indent level
|
117
|
-
# @param [String]
|
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
|
-
#
|
127
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
|
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
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.
|
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 |
|
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 =
|
311
|
-
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|