pione 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/History.txt
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# History
|
2
2
|
|
3
|
-
## 0.1.
|
3
|
+
## 0.1.2(2013/04/01)
|
4
|
+
|
5
|
+
* Added shorthand notation for setting parameters
|
6
|
+
* Added ticket concept for sequential processing
|
7
|
+
* Improved termination sequence
|
8
|
+
* Refactored parser and transformer
|
9
|
+
|
10
|
+
## 0.1.1(2013/03/20)
|
4
11
|
|
5
12
|
* Improved performance
|
6
13
|
* Added the concept of document parameter
|
@@ -8,6 +15,6 @@
|
|
8
15
|
* Fixed bugs of features handling
|
9
16
|
* Improved comment parser
|
10
17
|
|
11
|
-
## 0.1.0
|
18
|
+
## 0.1.0(2013/02/19)
|
12
19
|
|
13
20
|
* First gem release
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
desc 'Show undocumented function list'
|
11
11
|
task 'html:undoc' do
|
12
|
-
sh 'bundle exec yard stats --list-undoc --no-api --private'
|
12
|
+
sh 'bundle exec yard stats --list-undoc --no-api --private --compact'
|
13
13
|
end
|
14
14
|
|
15
15
|
desc 'count characters in input direcotry'
|
data/example/Fib/Fib.pione
CHANGED
@@ -3,8 +3,8 @@ param $NUM := 3
|
|
3
3
|
Rule Main
|
4
4
|
output 'result.txt'
|
5
5
|
Flow
|
6
|
-
rule Fib
|
7
|
-
rule Result
|
6
|
+
rule Fib {N: $NUM}
|
7
|
+
rule Result {N: $NUM}
|
8
8
|
End
|
9
9
|
|
10
10
|
Rule Fib0
|
@@ -31,9 +31,9 @@ Flow
|
|
31
31
|
else
|
32
32
|
$P1 := $N - 2
|
33
33
|
$P2 := $N - 1
|
34
|
-
rule Fib
|
35
|
-
rule Fib
|
36
|
-
rule Calc
|
34
|
+
rule Fib {N: $P1}
|
35
|
+
rule Fib {N: $P2}
|
36
|
+
rule Calc {N: $N, P1: $P1, P2: $P2}
|
37
37
|
end
|
38
38
|
End
|
39
39
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
Rule Main
|
2
|
+
output '*.a'.all
|
3
|
+
output '*.b'.all
|
4
|
+
Flow
|
5
|
+
rule A ==> <T>
|
6
|
+
rule <T> ==> B
|
7
|
+
End
|
8
|
+
|
9
|
+
Rule A
|
10
|
+
output '*.a'.all
|
11
|
+
Flow
|
12
|
+
rule <T> ==> A4
|
13
|
+
rule A1 >>> A2 >>> A3 ==> <T>
|
14
|
+
End
|
15
|
+
|
16
|
+
Rule A1
|
17
|
+
output '1.a'
|
18
|
+
Action
|
19
|
+
echo "A1" > {$O[1]}
|
20
|
+
End
|
21
|
+
|
22
|
+
Rule A2
|
23
|
+
output '2.a'
|
24
|
+
Action
|
25
|
+
echo "A2" > {$O[1]}
|
26
|
+
End
|
27
|
+
|
28
|
+
Rule A3
|
29
|
+
output '3.a'
|
30
|
+
Action
|
31
|
+
echo "A3" > {$O[1]}
|
32
|
+
End
|
33
|
+
|
34
|
+
Rule A4
|
35
|
+
output '4.a'
|
36
|
+
Action
|
37
|
+
echo "A4" > {$O[1]}
|
38
|
+
End
|
39
|
+
|
40
|
+
Rule B
|
41
|
+
output '*.b'.all
|
42
|
+
Flow
|
43
|
+
rule <T> ==> B4
|
44
|
+
rule B1 >>> B2 >>> B3 ==> <T>
|
45
|
+
End
|
46
|
+
|
47
|
+
Rule B1
|
48
|
+
output '1.b'
|
49
|
+
Action
|
50
|
+
echo "B1" > {$O[1]}
|
51
|
+
End
|
52
|
+
|
53
|
+
Rule B2
|
54
|
+
output '2.b'
|
55
|
+
Action
|
56
|
+
echo "B2" > {$O[1]}
|
57
|
+
End
|
58
|
+
|
59
|
+
Rule B3
|
60
|
+
output '3.b'
|
61
|
+
Action
|
62
|
+
echo "B3" > {$O[1]}
|
63
|
+
End
|
64
|
+
|
65
|
+
Rule B4
|
66
|
+
output '4.b'
|
67
|
+
Action
|
68
|
+
echo "B4" > {$O[1]}
|
69
|
+
End
|
data/lib/pione.rb
CHANGED
@@ -29,6 +29,7 @@ require 'ostruct'
|
|
29
29
|
require 'net/ftp'
|
30
30
|
require 'highline'
|
31
31
|
require 'dropbox_sdk'
|
32
|
+
require 'hamster'
|
32
33
|
require 'naming'
|
33
34
|
|
34
35
|
#
|
@@ -41,7 +42,7 @@ require 'pione/version'
|
|
41
42
|
# util
|
42
43
|
require 'pione/util/misc'
|
43
44
|
require 'pione/util/terminal'
|
44
|
-
require 'pione/util/message'
|
45
|
+
require 'pione/util/console-message'
|
45
46
|
require 'pione/util/log'
|
46
47
|
require 'pione/util/waiter-table'
|
47
48
|
require 'pione/util/error-report'
|
@@ -94,6 +95,7 @@ require 'pione/model/variable-table'
|
|
94
95
|
require 'pione/model/data-expr'
|
95
96
|
require 'pione/model/parameters'
|
96
97
|
require 'pione/model/package'
|
98
|
+
require 'pione/model/ticket-expr'
|
97
99
|
require 'pione/model/rule-expr'
|
98
100
|
require 'pione/model/binary-operator'
|
99
101
|
require 'pione/model/message'
|
@@ -123,6 +125,7 @@ require 'pione/tuple/exception-tuple'
|
|
123
125
|
require 'pione/tuple/log-tuple'
|
124
126
|
require 'pione/tuple/rule-tuple'
|
125
127
|
require 'pione/tuple/task-worker-resource-tuple'
|
128
|
+
require 'pione/tuple/ticket-tuple'
|
126
129
|
|
127
130
|
# tuple-space
|
128
131
|
require 'pione/tuple-space/tuple-space-server-interface'
|
@@ -134,7 +137,7 @@ require 'pione/tuple-space/data-finder'
|
|
134
137
|
require 'pione/tuple-space/update-criteria'
|
135
138
|
|
136
139
|
# parser
|
137
|
-
require 'pione/parser/
|
140
|
+
require 'pione/parser/parslet-extension'
|
138
141
|
require 'pione/parser/common-parser'
|
139
142
|
require 'pione/parser/literal-parser'
|
140
143
|
require 'pione/parser/feature-expr-parser'
|
@@ -145,14 +148,7 @@ require 'pione/parser/rule-definition-parser'
|
|
145
148
|
require 'pione/parser/document-parser'
|
146
149
|
|
147
150
|
# transformer
|
148
|
-
require 'pione/transformer
|
149
|
-
require 'pione/transformer/literal-transformer'
|
150
|
-
require 'pione/transformer/feature-expr-transformer'
|
151
|
-
require 'pione/transformer/expr-transformer'
|
152
|
-
require 'pione/transformer/flow-element-transformer'
|
153
|
-
require 'pione/transformer/block-transformer'
|
154
|
-
require 'pione/transformer/rule-definition-transformer'
|
155
|
-
require 'pione/transformer/document-transformer'
|
151
|
+
require 'pione/transformer'
|
156
152
|
|
157
153
|
# resource
|
158
154
|
require 'pione/resource/basic-resource'
|
@@ -227,7 +223,7 @@ module Pione
|
|
227
223
|
include System
|
228
224
|
include Relay
|
229
225
|
include Util
|
230
|
-
include Util::
|
226
|
+
include Util::ConsoleMessage
|
231
227
|
include Model
|
232
228
|
include TupleSpace
|
233
229
|
include Parser
|
@@ -73,9 +73,10 @@ module Pione
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
#
|
76
|
+
# Initialize the generator. This method is called when root rule is
|
77
77
|
# requested in stream mode.
|
78
|
-
#
|
78
|
+
#
|
79
|
+
# @return [void]
|
79
80
|
def init
|
80
81
|
if @dir_path
|
81
82
|
@gen = Resource[@dir_path].entries.to_enum
|
@@ -213,18 +213,21 @@ module Pione
|
|
213
213
|
|
214
214
|
debug_message_end "End Task Execution #{rule.rule_path} by worker(#{uuid})"
|
215
215
|
|
216
|
-
return task, handler, @__result_task_execution__
|
216
|
+
return task, rule, handler, @__result_task_execution__
|
217
217
|
end
|
218
218
|
|
219
219
|
# State data_outputing.
|
220
|
-
# @param [Task]
|
220
|
+
# @param task [Task]
|
221
221
|
# task tuple
|
222
|
+
# @param rule [Rule]
|
223
|
+
# rule model
|
222
224
|
# @param [RuleHandler] handler
|
223
225
|
# rule handler
|
224
226
|
# @param [Array<Data>] result
|
225
227
|
# result data tuples
|
226
228
|
# @return [Array<Task,RuleHandler>]
|
227
|
-
def transit_to_data_outputing(task, handler, result)
|
229
|
+
def transit_to_data_outputing(task, rule, handler, result)
|
230
|
+
# output data
|
228
231
|
result.flatten.each do |output|
|
229
232
|
begin
|
230
233
|
write(output)
|
@@ -9,17 +9,18 @@ module Pione
|
|
9
9
|
define_state_transition :initialized => :working
|
10
10
|
define_state_transition :working => :working
|
11
11
|
|
12
|
-
#
|
13
|
-
#
|
12
|
+
# Create a trivial routine worker.
|
13
|
+
#
|
14
|
+
# @param action [Proc]
|
14
15
|
# worker's action as proc object
|
15
|
-
# @param [Integer] sec
|
16
|
-
# sleeping time
|
17
16
|
def initialize(action)
|
18
17
|
raise ArgumentError.new(action) unless action.kind_of?(Proc)
|
19
18
|
@action = action
|
20
19
|
end
|
21
20
|
|
22
|
-
#
|
21
|
+
# Call the action.
|
22
|
+
#
|
23
|
+
# @return [void]
|
23
24
|
def transit_to_working
|
24
25
|
@action.call
|
25
26
|
end
|
@@ -123,8 +123,14 @@ module Pione
|
|
123
123
|
raise NotImplementedError
|
124
124
|
end
|
125
125
|
|
126
|
+
# Terminate the command. Exit from PIONE system.
|
127
|
+
#
|
128
|
+
# @return [void]
|
126
129
|
def terminate
|
127
|
-
|
130
|
+
Global.monitor.synchronize do
|
131
|
+
# exit with no exception
|
132
|
+
exit!
|
133
|
+
end
|
128
134
|
end
|
129
135
|
end
|
130
136
|
end
|
@@ -33,10 +33,14 @@ module Pione
|
|
33
33
|
@watchdog.start
|
34
34
|
end
|
35
35
|
|
36
|
+
# Terminate the child front. Kill watchdog.
|
37
|
+
#
|
38
|
+
# @return [void]
|
36
39
|
def terminate
|
40
|
+
# kill watchdog
|
37
41
|
@watchdog.terminate
|
42
|
+
# go to other termination processes
|
38
43
|
super
|
39
|
-
abort
|
40
44
|
end
|
41
45
|
end
|
42
46
|
end
|
@@ -6,6 +6,8 @@ module Pione
|
|
6
6
|
end
|
7
7
|
|
8
8
|
# Runs the command.
|
9
|
+
#
|
10
|
+
# @return [void]
|
9
11
|
def run
|
10
12
|
parse_options
|
11
13
|
validate_options
|
@@ -15,22 +17,31 @@ module Pione
|
|
15
17
|
start
|
16
18
|
end
|
17
19
|
|
18
|
-
#
|
20
|
+
# Setup font server.
|
21
|
+
#
|
19
22
|
# @return [void]
|
20
23
|
def setup_front
|
21
24
|
Global.front = create_front
|
22
25
|
end
|
23
26
|
|
24
|
-
#
|
27
|
+
# Create a front server. This method should be overridden in subclasses.
|
28
|
+
#
|
25
29
|
# @return [BasicFront]
|
26
30
|
# front server
|
27
31
|
def create_front
|
28
32
|
raise NotImplementedError
|
29
33
|
end
|
30
34
|
|
35
|
+
# Terminate PIONE front. Stop DRb service.
|
36
|
+
#
|
37
|
+
# @return [void]
|
31
38
|
def terminate
|
32
|
-
|
33
|
-
|
39
|
+
Global.monitor.synchronize do
|
40
|
+
# stop DRb service
|
41
|
+
DRb.stop_service
|
42
|
+
# go to other termination processes
|
43
|
+
super
|
44
|
+
end
|
34
45
|
end
|
35
46
|
end
|
36
47
|
end
|
@@ -203,19 +203,26 @@ module Pione
|
|
203
203
|
terminate
|
204
204
|
end
|
205
205
|
|
206
|
+
# Terminate pione-client command. Kill tuple space provider.
|
207
|
+
#
|
208
|
+
# @return [void]
|
206
209
|
def terminate
|
207
|
-
|
208
|
-
|
209
|
-
if @start_tuple_space_provider_thread
|
210
|
-
@start_tuple_space_provider_thread.
|
210
|
+
Global.monitor.synchronize do
|
211
|
+
# kill the thread for starting tuple space provider
|
212
|
+
if @start_tuple_space_provider_thread
|
213
|
+
if @start_tuple_space_provider_thread.alive?
|
214
|
+
@start_tuple_space_provider_thread.kill
|
215
|
+
end
|
211
216
|
end
|
212
|
-
end
|
213
217
|
|
214
|
-
|
215
|
-
|
216
|
-
|
218
|
+
# terminate tuple space provider
|
219
|
+
if @tuple_space_provider
|
220
|
+
@tuple_space_provider.terminate
|
221
|
+
end
|
222
|
+
|
223
|
+
# go to other termination processes.
|
224
|
+
super
|
217
225
|
end
|
218
|
-
super
|
219
226
|
end
|
220
227
|
|
221
228
|
private
|
@@ -16,6 +16,11 @@ TXT
|
|
16
16
|
@transform = true
|
17
17
|
end
|
18
18
|
|
19
|
+
define_option('-f', '--file=PATH', 'check syntax of the document') do |path|
|
20
|
+
@document = path
|
21
|
+
@readline_mode = false
|
22
|
+
end
|
23
|
+
|
19
24
|
def initialize
|
20
25
|
@readline_mode = true
|
21
26
|
end
|
@@ -28,53 +33,63 @@ TXT
|
|
28
33
|
|
29
34
|
def start
|
30
35
|
if @readline_mode
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
36
|
+
start_readline_mode
|
37
|
+
else
|
38
|
+
if @document
|
39
|
+
print_result(Pathname.new(@document).read)
|
40
|
+
else
|
41
|
+
# print parsing result
|
42
|
+
print_result(@expr)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
35
46
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
puts buf
|
50
|
-
print_result(buf)
|
51
|
-
buf = ""
|
52
|
-
mark = ">"
|
53
|
-
end
|
54
|
-
else
|
55
|
-
# don't record if it is an empty line
|
47
|
+
private
|
48
|
+
|
49
|
+
def start_readline_mode
|
50
|
+
require 'readline'
|
51
|
+
restore_history
|
52
|
+
buf = ""
|
53
|
+
mark = ">"
|
54
|
+
|
55
|
+
# start loop
|
56
|
+
while buf += Readline.readline(Terminal.red("#{mark} "), true)
|
57
|
+
if /[^\s]/.match(buf)
|
58
|
+
# don't record if previous line is the same
|
59
|
+
if Readline::HISTORY.size > 1 && Readline::HISTORY[-2] == buf
|
56
60
|
Readline::HISTORY.pop
|
57
61
|
end
|
62
|
+
if buf[-1] == "\\"
|
63
|
+
buf[-1] = "\n"
|
64
|
+
mark = "+"
|
65
|
+
next
|
66
|
+
else
|
67
|
+
# print parsing result
|
68
|
+
puts buf
|
69
|
+
print_result(buf)
|
70
|
+
buf = ""
|
71
|
+
mark = ">"
|
72
|
+
end
|
73
|
+
else
|
74
|
+
# don't record if it is an empty line
|
75
|
+
Readline::HISTORY.pop
|
58
76
|
end
|
59
|
-
else
|
60
77
|
# print parsing result
|
61
|
-
print_result(
|
78
|
+
print_result(buf)
|
62
79
|
end
|
63
80
|
end
|
64
81
|
|
65
|
-
private
|
66
|
-
|
67
82
|
# Prints parsing result of the string
|
68
83
|
def print_result(str)
|
69
84
|
begin
|
70
85
|
puts Terminal.green("syntax:")
|
71
|
-
stree = DocumentParser.new.parse(str)
|
86
|
+
stree = DocumentParser.new.parse(str)
|
72
87
|
pp stree
|
73
88
|
if @transform
|
74
89
|
puts Terminal.green("model:")
|
75
90
|
pp DocumentTransformer.new.apply(stree)
|
76
91
|
end
|
77
|
-
rescue Pione::Parser::ParserError, Parslet::
|
92
|
+
rescue Pione::Parser::ParserError, Parslet::ParseFailed => e
|
78
93
|
msg = "Pione syntax error: %s (%s)" % [e.message, e.class.name]
|
79
94
|
@readline_mode ? puts(msg) : abort(msg)
|
80
95
|
rescue Pione::Model::PioneModelTypeError,
|