pione 0.2.2 → 0.3.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 (593) hide show
  1. data/.gitignore +1 -0
  2. data/.simplecov +1 -0
  3. data/History.txt +9 -0
  4. data/Rakefile +1 -71
  5. data/example/Fib/Fib.pione +9 -8
  6. data/example/HelloWorld/HelloWorld.pione +2 -0
  7. data/example/HelloWorld/pione-package.json +15 -0
  8. data/example/HelloWorld/scenario/Scenario.pione +2 -0
  9. data/example/HelloWorld/scenario/pione-scenario.json +10 -0
  10. data/example/SerialProcessing/SerialProcessing.pione +2 -0
  11. data/example/SerialProcessing/pione-package.json +15 -0
  12. data/example/SerialProcessing/scenario/Scenario.pione +1 -0
  13. data/example/SerialProcessing/scenario/pione-scenario.json +10 -0
  14. data/lib/pione.rb +28 -35
  15. data/lib/pione/agent.rb +4 -4
  16. data/lib/pione/agent/agent-exception.rb +52 -0
  17. data/lib/pione/agent/basic-agent.rb +246 -239
  18. data/lib/pione/agent/broker.rb +232 -216
  19. data/lib/pione/agent/input-generator.rb +113 -133
  20. data/lib/pione/agent/job-terminator.rb +38 -0
  21. data/lib/pione/agent/logger.rb +24 -54
  22. data/lib/pione/agent/messenger.rb +11 -16
  23. data/lib/pione/agent/process-manager.rb +50 -19
  24. data/lib/pione/agent/task-worker.rb +126 -236
  25. data/lib/pione/agent/tuple-space-client.rb +16 -39
  26. data/lib/pione/agent/tuple-space-provider.rb +66 -0
  27. data/lib/pione/agent/tuple-space-receiver.rb +137 -0
  28. data/lib/pione/command.rb +2 -3
  29. data/lib/pione/command/basic-command.rb +347 -207
  30. data/lib/pione/command/command-exception.rb +38 -0
  31. data/lib/pione/command/option.rb +112 -104
  32. data/lib/pione/command/pione-broker.rb +85 -43
  33. data/lib/pione/command/pione-clean.rb +51 -8
  34. data/lib/pione/command/pione-client.rb +321 -292
  35. data/lib/pione/command/pione-log.rb +92 -53
  36. data/lib/pione/command/pione-package.rb +112 -59
  37. data/lib/pione/command/pione-relay-account-db.rb +107 -78
  38. data/lib/pione/command/pione-relay-client-db.rb +93 -72
  39. data/lib/pione/command/pione-relay.rb +37 -32
  40. data/lib/pione/command/pione-syntax-checker.rb +112 -87
  41. data/lib/pione/command/pione-task-worker.rb +135 -118
  42. data/lib/pione/command/pione-tuple-space-provider.rb +83 -50
  43. data/lib/pione/command/pione-tuple-space-receiver.rb +89 -50
  44. data/lib/pione/command/pione-tuple-space-viewer.rb +101 -99
  45. data/lib/pione/command/pione-val.rb +50 -29
  46. data/lib/pione/command/spawner.rb +74 -0
  47. data/lib/pione/front.rb +0 -2
  48. data/lib/pione/front/basic-front.rb +48 -26
  49. data/lib/pione/front/broker-front.rb +8 -16
  50. data/lib/pione/front/client-front.rb +10 -18
  51. data/lib/pione/front/front-exception.rb +12 -0
  52. data/lib/pione/front/relay-front.rb +6 -6
  53. data/lib/pione/front/task-worker-front.rb +3 -9
  54. data/lib/pione/front/tuple-space-provider-front.rb +6 -14
  55. data/lib/pione/front/tuple-space-receiver-front.rb +4 -11
  56. data/lib/pione/global.rb +135 -0
  57. data/lib/pione/global/broker-variable.rb +20 -0
  58. data/lib/pione/global/client-variable.rb +18 -0
  59. data/lib/pione/global/input-generator-variable.rb +7 -0
  60. data/lib/pione/global/log-variable.rb +53 -0
  61. data/lib/pione/global/network-variable.rb +7 -0
  62. data/lib/pione/global/package-variable.rb +28 -0
  63. data/lib/pione/global/path-variable.rb +52 -0
  64. data/lib/pione/global/relay-variable.rb +86 -0
  65. data/lib/pione/global/system-variable.rb +39 -0
  66. data/lib/pione/global/task-worker-variable.rb +17 -0
  67. data/lib/pione/global/tuple-space-notifier-variable.rb +60 -0
  68. data/lib/pione/lang.rb +55 -0
  69. data/lib/pione/lang/basic-model.rb +45 -0
  70. data/lib/pione/lang/boolean.rb +86 -0
  71. data/lib/pione/lang/common-parser.rb +202 -0
  72. data/lib/pione/lang/conditional-branch-parser.rb +57 -0
  73. data/lib/pione/lang/conditional-branch-transformer.rb +36 -0
  74. data/lib/pione/lang/conditional-branch.rb +73 -0
  75. data/lib/pione/lang/context-parser.rb +39 -0
  76. data/lib/pione/lang/context-transformer.rb +41 -0
  77. data/lib/pione/lang/context.rb +229 -0
  78. data/lib/pione/lang/data-expr.rb +265 -0
  79. data/lib/pione/lang/declaration-parser.rb +174 -0
  80. data/lib/pione/lang/declaration-transformer.rb +153 -0
  81. data/lib/pione/lang/declaration.rb +322 -0
  82. data/lib/pione/lang/definition.rb +88 -0
  83. data/lib/pione/lang/document-parser.rb +19 -0
  84. data/lib/pione/lang/document-transformer.rb +12 -0
  85. data/lib/pione/lang/environment.rb +344 -0
  86. data/lib/pione/{parser → lang}/error-message.yml +0 -0
  87. data/lib/pione/lang/expr-parser.rb +228 -0
  88. data/lib/pione/{transformer → lang}/expr-transformer.rb +32 -44
  89. data/lib/pione/lang/expr.rb +70 -0
  90. data/lib/pione/lang/feature-expr.rb +425 -0
  91. data/lib/pione/lang/float.rb +104 -0
  92. data/lib/pione/lang/integer.rb +159 -0
  93. data/lib/pione/lang/interpolator-parser.rb +44 -0
  94. data/lib/pione/lang/interpolator-transformer.rb +13 -0
  95. data/lib/pione/lang/keyed-sequence.rb +98 -0
  96. data/lib/pione/lang/lang-exception.rb +224 -0
  97. data/lib/pione/lang/literal-parser.rb +134 -0
  98. data/lib/pione/lang/literal-transformer.rb +171 -0
  99. data/lib/pione/lang/message.rb +41 -0
  100. data/lib/pione/lang/ordinal-sequence.rb +203 -0
  101. data/lib/pione/lang/package-expr.rb +86 -0
  102. data/lib/pione/lang/parameters.rb +121 -0
  103. data/lib/pione/lang/piece.rb +42 -0
  104. data/lib/pione/{model → lang}/pione-method.rb +26 -63
  105. data/lib/pione/lang/rule-expr.rb +70 -0
  106. data/lib/pione/lang/sequence.rb +215 -0
  107. data/lib/pione/lang/string.rb +116 -0
  108. data/lib/pione/lang/ticket-expr.rb +48 -0
  109. data/lib/pione/{model → lang}/type.rb +70 -99
  110. data/lib/pione/lang/variable.rb +35 -0
  111. data/lib/pione/location.rb +13 -1
  112. data/lib/pione/{uri-scheme → location}/broadcast-scheme.rb +2 -2
  113. data/lib/pione/location/data-location.rb +22 -5
  114. data/lib/pione/location/dropbox-location.rb +10 -8
  115. data/lib/pione/{uri-scheme → location}/dropbox-scheme.rb +2 -2
  116. data/lib/pione/location/ftp-location.rb +6 -0
  117. data/lib/pione/location/git-repository-location.rb +6 -17
  118. data/lib/pione/{uri-scheme → location}/git-scheme.rb +2 -2
  119. data/lib/pione/location/http-location.rb +8 -1
  120. data/lib/pione/location/local-location.rb +57 -4
  121. data/lib/pione/{uri-scheme → location}/local-scheme.rb +2 -2
  122. data/lib/pione/location/{exception.rb → location-exception.rb} +13 -1
  123. data/lib/pione/{uri-scheme/basic-scheme.rb → location/location-scheme.rb} +7 -6
  124. data/lib/pione/{uri-scheme → location}/myftp-scheme.rb +2 -2
  125. data/lib/pione/log.rb +7 -6
  126. data/lib/pione/log/debug.rb +75 -0
  127. data/lib/pione/log/domain-log.rb +4 -5
  128. data/lib/pione/log/message-log.rb +2 -2
  129. data/lib/pione/log/process-log.rb +16 -25
  130. data/lib/pione/log/process-record.rb +1 -0
  131. data/lib/pione/log/system-log.rb +165 -55
  132. data/lib/pione/package.rb +21 -0
  133. data/lib/pione/package/document.rb +27 -0
  134. data/lib/pione/package/package-archiver.rb +152 -0
  135. data/lib/pione/package/package-cache.rb +79 -0
  136. data/lib/pione/package/package-database.rb +121 -0
  137. data/lib/pione/package/package-exception.rb +38 -0
  138. data/lib/pione/{component → package}/package-expander.rb +13 -7
  139. data/lib/pione/package/package-filename.rb +46 -0
  140. data/lib/pione/package/package-handler.rb +106 -0
  141. data/lib/pione/package/package-info.rb +72 -0
  142. data/lib/pione/package/package-reader.rb +202 -0
  143. data/lib/pione/package/package-scanner.rb +133 -0
  144. data/lib/pione/package/scenario-handler.rb +95 -0
  145. data/lib/pione/package/scenario-info.rb +34 -0
  146. data/lib/pione/package/scenario-reader.rb +29 -0
  147. data/lib/pione/package/scenario-scanner.rb +96 -0
  148. data/lib/pione/patch.rb +0 -1
  149. data/lib/pione/patch/drb-patch.rb +377 -298
  150. data/lib/pione/patch/rinda-patch.rb +4 -3
  151. data/lib/pione/relay/relay-socket.rb +1 -4
  152. data/lib/pione/rule-engine.rb +27 -0
  153. data/lib/pione/{rule-handler → rule-engine}/action-handler.rb +41 -40
  154. data/lib/pione/rule-engine/basic-handler.rb +266 -0
  155. data/lib/pione/rule-engine/data-finder.rb +97 -0
  156. data/lib/pione/{rule-handler → rule-engine}/empty-handler.rb +2 -3
  157. data/lib/pione/rule-engine/engine-exception.rb +33 -0
  158. data/lib/pione/rule-engine/flow-handler.rb +490 -0
  159. data/lib/pione/{rule-handler → rule-engine}/root-handler.rb +5 -14
  160. data/lib/pione/{rule-handler → rule-engine}/system-handler.rb +1 -1
  161. data/lib/pione/rule-engine/update-criteria.rb +111 -0
  162. data/lib/pione/system.rb +3 -1
  163. data/lib/pione/system/config.rb +12 -45
  164. data/lib/pione/system/domain-info.rb +3 -12
  165. data/lib/pione/system/init.rb +2 -8
  166. data/lib/pione/system/system-exception.rb +29 -0
  167. data/lib/pione/test-helper.rb +43 -0
  168. data/lib/pione/test-helper/command-helper.rb +65 -0
  169. data/lib/pione/test-helper/extension.rb +9 -0
  170. data/lib/pione/test-helper/lang-helper.rb +196 -0
  171. data/lib/pione/test-helper/location-helper.rb +27 -0
  172. data/lib/pione/test-helper/package-helper.rb +11 -0
  173. data/lib/pione/test-helper/parser-helper.rb +45 -0
  174. data/lib/pione/test-helper/transformer-helper.rb +136 -0
  175. data/lib/pione/test-helper/tuple-helper.rb +13 -0
  176. data/lib/pione/test-helper/tuple-space-helper.rb +31 -0
  177. data/lib/pione/test-helper/webserver.rb +50 -0
  178. data/lib/pione/tuple-space.rb +4 -6
  179. data/lib/pione/{tuple → tuple-space}/basic-tuple.rb +63 -50
  180. data/lib/pione/tuple-space/tuple-definition.yml +165 -0
  181. data/lib/pione/tuple-space/tuple-space-exception.rb +25 -0
  182. data/lib/pione/tuple-space/tuple-space-interface.rb +123 -0
  183. data/lib/pione/tuple-space/tuple-space-server.rb +15 -26
  184. data/lib/pione/util.rb +16 -11
  185. data/lib/pione/util/backslash-notation.rb +11 -0
  186. data/lib/pione/util/digest.rb +71 -0
  187. data/lib/pione/util/embeded-expr-expander.rb +23 -0
  188. data/lib/pione/util/evaluatable.rb +9 -6
  189. data/lib/pione/util/free-thread-generator.rb +46 -0
  190. data/lib/pione/util/ftp-server.rb +3 -4
  191. data/lib/pione/util/id.rb +28 -23
  192. data/lib/pione/util/misc.rb +22 -4
  193. data/lib/pione/util/package-parameters-list.rb +12 -9
  194. data/lib/pione/{parser → util}/parslet-extension.rb +75 -64
  195. data/lib/pione/util/positionable.rb +65 -0
  196. data/lib/pione/util/zip.rb +12 -11
  197. data/lib/pione/version.rb +1 -1
  198. data/{test → misc}/endurance-test/graph.plt +0 -0
  199. data/{test → misc}/endurance-test/run.sh +0 -0
  200. data/pione.gemspec +45 -37
  201. data/test/agent/spec_basic-agent.rb +116 -99
  202. data/test/agent/spec_broker.rb +41 -25
  203. data/test/agent/spec_input-generator.rb +66 -57
  204. data/test/agent/spec_job-terminator.rb +27 -0
  205. data/test/agent/spec_logger.rb +28 -25
  206. data/test/agent/spec_messenger.rb +6 -6
  207. data/test/agent/spec_task-worker.rb +97 -246
  208. data/test/agent/spec_tuple-space-client.rb +19 -15
  209. data/test/agent/spec_tuple-space-provider.rb +26 -0
  210. data/test/agent/spec_tuple-space-receiver.rb +47 -0
  211. data/test/command/command-behavior.rb +2 -2
  212. data/test/command/data/PionePackageP1/P1.pione +9 -0
  213. data/test/command/data/PionePackageP1/pione-package.json +15 -0
  214. data/test/command/data/PionePackageP2/P2.pione +10 -0
  215. data/test/command/data/PionePackageP2/pione-package.json +16 -0
  216. data/test/command/data/PionePackageP3/P3.pione +10 -0
  217. data/test/command/data/PionePackageP3/pione-package.json +16 -0
  218. data/test/command/data/PionePackageP4/P4.pione +10 -0
  219. data/test/command/data/PionePackageP4/pione-package.json +17 -0
  220. data/test/command/data/pione-process.log +471 -0
  221. data/test/command/data/pione-val.domain.dump +0 -0
  222. data/test/command/spec_pione-clean.rb +12 -0
  223. data/test/command/spec_pione-client.rb +6 -6
  224. data/test/command/spec_pione-log.rb +28 -0
  225. data/test/command/spec_pione-package.rb +111 -12
  226. data/test/command/spec_pione-val.rb +4 -4
  227. data/test/lang/data/boolean.yml +134 -0
  228. data/test/lang/data/common-parser.yml +187 -0
  229. data/test/{parser/spec_flow-element-parser.yml → lang/data/conditional-branch-parser.yml} +12 -50
  230. data/test/lang/data/context-parser.yml +148 -0
  231. data/test/lang/data/data-expr.yml +93 -0
  232. data/test/lang/data/data-expr_match.yml +59 -0
  233. data/test/lang/data/declaration-parser.yml +279 -0
  234. data/test/lang/data/document-parser.yml +29 -0
  235. data/test/{parser/spec_expr-parser.yml → lang/data/expr-parser.yml} +9 -11
  236. data/test/lang/data/feature-expr.yml +148 -0
  237. data/test/lang/data/float.yml +30 -0
  238. data/test/lang/data/integer.yml +80 -0
  239. data/test/lang/data/interpolator-parser.yml +61 -0
  240. data/test/lang/data/keyed-sequence.yml +27 -0
  241. data/test/lang/data/literal-parser.yml +207 -0
  242. data/test/lang/data/parameter-set.yml +14 -0
  243. data/test/lang/data/rule-expr.yml +27 -0
  244. data/test/lang/data/sequence.yml +66 -0
  245. data/test/lang/data/string.yml +92 -0
  246. data/test/{model/spec_ticket-expr.yml → lang/data/ticket-expr.yml} +0 -0
  247. data/test/lang/spec_boolean.rb +5 -0
  248. data/test/{parser → lang}/spec_common-parser.rb +10 -32
  249. data/test/lang/spec_conditional-branch-parser.rb +5 -0
  250. data/test/lang/spec_conditional-branch-transformer.rb +97 -0
  251. data/test/lang/spec_conditional-branch.rb +176 -0
  252. data/test/lang/spec_context-parser.rb +5 -0
  253. data/test/lang/spec_context-transformer.rb +206 -0
  254. data/test/lang/spec_context.rb +283 -0
  255. data/test/lang/spec_data-expr.rb +198 -0
  256. data/test/lang/spec_declaration-parser.rb +5 -0
  257. data/test/lang/spec_declaration-transformer.rb +272 -0
  258. data/test/lang/spec_declaration.rb +550 -0
  259. data/test/lang/spec_document-parser.rb +5 -0
  260. data/test/lang/spec_document-transformer.rb +10 -0
  261. data/test/lang/spec_environment.rb +129 -0
  262. data/test/lang/spec_expr-parser.rb +6 -0
  263. data/test/lang/spec_expr-transformer.rb +149 -0
  264. data/test/lang/spec_feature-expr.rb +5 -0
  265. data/test/lang/spec_float.rb +23 -0
  266. data/test/lang/spec_integer.rb +29 -0
  267. data/test/lang/spec_interpolator-parser.rb +5 -0
  268. data/test/lang/spec_interpolator-transformer.rb +15 -0
  269. data/test/lang/spec_keyed-sequence.rb +5 -0
  270. data/test/lang/spec_literal-parser.rb +5 -0
  271. data/test/lang/spec_literal-transformer.rb +111 -0
  272. data/test/lang/spec_message.rb +22 -0
  273. data/test/lang/spec_package-expr.rb +19 -0
  274. data/test/lang/spec_parameter-set.rb +64 -0
  275. data/test/lang/spec_pione-method.rb +57 -0
  276. data/test/lang/spec_rule-expr.rb +18 -0
  277. data/test/lang/spec_sequence.rb +5 -0
  278. data/test/lang/spec_string.rb +5 -0
  279. data/test/lang/spec_ticket-expr.rb +39 -0
  280. data/test/lang/spec_variable.rb +29 -0
  281. data/test/{uri-scheme/spec_myftp-scheme.yml → location/data/myftp-scheme.yml} +0 -0
  282. data/test/location/location-behavior.rb +2 -2
  283. data/test/location/spec_basic-location.rb +5 -1
  284. data/test/{uri-scheme → location}/spec_broadcast-scheme.rb +4 -4
  285. data/test/{uri-scheme → location}/spec_dropbox-scheme.rb +3 -3
  286. data/test/location/spec_ftp-location.rb +3 -2
  287. data/test/location/spec_git-repository-location.rb +19 -19
  288. data/test/{uri-scheme → location}/spec_git-scheme.rb +2 -2
  289. data/test/location/spec_http-location.rb +4 -12
  290. data/test/location/spec_https-location.rb +1 -3
  291. data/test/location/spec_local-location.rb +1 -1
  292. data/test/{uri-scheme → location}/spec_local-scheme.rb +3 -3
  293. data/test/{uri-scheme → location}/spec_myftp-scheme.rb +8 -10
  294. data/test/log/spec_debug.rb +53 -0
  295. data/test/log/spec_domain-log.rb +4 -5
  296. data/test/log/spec_message-log.rb +39 -33
  297. data/test/log/spec_process-log.rb +4 -2
  298. data/test/log/spec_process-record.rb +12 -10
  299. data/test/log/spec_system-log.rb +29 -11
  300. data/test/log/spec_xes-log.rb +6 -4
  301. data/test/package/data/HelloWorld+v0.1.1.ppg +0 -0
  302. data/test/package/data/HelloWorld-gitrepos.zip +0 -0
  303. data/test/{test-data/package → package/data}/HelloWorld/HelloWorld.pione +3 -0
  304. data/test/package/data/HelloWorld/pione-package.json +16 -0
  305. data/test/package/data/HelloWorld/scenario/Scenario.pione +2 -0
  306. data/test/{test-data/package → package/data}/HelloWorld/scenario/output/message.txt +0 -0
  307. data/test/package/data/HelloWorld/scenario/pione-scenario.json +10 -0
  308. data/test/{test-data/package → package/data}/HelloWorld/scenario/scenario.yml +0 -0
  309. data/test/package/data/PackageScannerP1/P1.pione +11 -0
  310. data/test/package/data/PackageScannerP2/P2.pione +9 -0
  311. data/test/package/data/PackageScannerP3/P3.pione +17 -0
  312. data/test/package/data/PackageScannerP4/.Ignore.pione +1 -0
  313. data/test/package/data/PackageScannerP4/Doc1.pione +8 -0
  314. data/test/package/data/PackageScannerP4/Doc2.pione +6 -0
  315. data/test/package/data/PackageScannerP4/Doc3.pione +6 -0
  316. data/test/package/data/PackageScannerP4/P4.pione +8 -0
  317. data/test/package/data/PackageScannerP4/sub1/.Ignore.pione +1 -0
  318. data/test/package/data/PackageScannerP4/sub1/Doc4.pione +6 -0
  319. data/test/package/data/PackageScannerP4/sub1/sub1-1/.Ignore.pione +1 -0
  320. data/test/package/data/PackageScannerP4/sub1/sub1-1/Doc5.pione +6 -0
  321. data/test/package/data/PackageScannerP4/sub2/.Ignore.pione +1 -0
  322. data/test/package/data/PackageScannerP4/sub2/sub2-1/.Ignore.pione +1 -0
  323. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/.Ignore.pione +1 -0
  324. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/Doc6.pione +6 -0
  325. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/.Ignore.pione +1 -0
  326. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/Doc7.pione +6 -0
  327. data/test/package/data/PackageScannerP5/P5.pione +8 -0
  328. data/test/{model/spec_feature-expr.yml → package/data/PackageScannerP5/scenario1/Scenario.pione} +0 -0
  329. data/test/package/data/PackageScannerP5/scenario2/Scenario.pione +0 -0
  330. data/test/package/data/PackageScannerP5/scenario3/Scenario.pione +0 -0
  331. data/test/package/data/PackageScannerP5/sub1/scenario4/Scenario.pione +0 -0
  332. data/test/package/data/PackageScannerP5/sub1/sub1-1/scenario5/Scenario.pione +0 -0
  333. data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-1/scenario6/Scenario.pione +0 -0
  334. data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-2/scenario7/Scenario.pione +0 -0
  335. data/test/package/data/ScenarioScannerS1/Scenario.pione +1 -0
  336. data/test/package/data/ScenarioScannerS1/input/i1 +0 -0
  337. data/test/package/data/ScenarioScannerS1/input/i2 +0 -0
  338. data/test/package/data/ScenarioScannerS1/input/i3 +0 -0
  339. data/test/package/data/ScenarioScannerS1/output/o1 +0 -0
  340. data/test/package/data/ScenarioScannerS1/output/o2 +0 -0
  341. data/test/package/data/ScenarioScannerS1/output/o3 +0 -0
  342. data/test/package/data/ScenarioScannerS2/Scenario.pione +1 -0
  343. data/test/package/data/ScenarioScannerS2/output/o1 +0 -0
  344. data/test/package/data/ScenarioScannerS3/Scenario.pione +2 -0
  345. data/test/package/data/ScenarioScannerS4/Scenario.pione +0 -0
  346. data/test/package/data/ScenarioScannerS5/Scenario.pione +2 -0
  347. data/test/package/data/ScenarioScannerS6/Scenario.pione +5 -0
  348. data/test/package/data/ScenarioScannerS8/Scenario.pione +1 -0
  349. data/test/{test-data/package → package/data}/TestPackage1+v0.1.0.ppg +0 -0
  350. data/test/{test-data/package → package/data}/TestPackage1/Test.pione +3 -0
  351. data/test/{test-data/package → package/data}/TestPackage1/bin/count +0 -0
  352. data/test/{test-data/package → package/data}/TestPackage1/package.yml +0 -0
  353. data/test/package/data/TestPackage1/pione-package.json +18 -0
  354. data/test/package/data/TestPackage1/scenario/case1/Scenario.pione +1 -0
  355. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/input/1.txt +0 -0
  356. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/output/1.count +0 -0
  357. data/test/package/data/TestPackage1/scenario/case1/pione-scenario.json +10 -0
  358. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/scenario.yml +0 -0
  359. data/test/package/data/TestPackage1/scenario/case2/Scenario.pione +1 -0
  360. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/1.txt +0 -0
  361. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/2.txt +0 -0
  362. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/3.txt +0 -0
  363. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/1.count +0 -0
  364. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/2.count +0 -0
  365. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/3.count +0 -0
  366. data/test/package/data/TestPackage1/scenario/case2/pione-scenario.json +14 -0
  367. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/scenario.yml +0 -0
  368. data/test/package/data/TestPackage1/scenario/case3/Scenario.pione +1 -0
  369. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/a.txt +0 -0
  370. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/b.txt +0 -0
  371. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/a.count +0 -0
  372. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/b.count +0 -0
  373. data/test/package/data/TestPackage1/scenario/case3/pione-scenario.json +12 -0
  374. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/scenario.yml +0 -0
  375. data/test/{component → package}/spec_document.pione +0 -0
  376. data/test/package/spec_document.rb +52 -0
  377. data/test/package/spec_package-archiver.rb +31 -0
  378. data/test/package/spec_package-database.rb +42 -0
  379. data/test/package/spec_package-expander.rb +14 -0
  380. data/test/package/spec_package-filename.rb +56 -0
  381. data/test/package/spec_package-handler.rb +50 -0
  382. data/test/package/spec_package-info.rb +22 -0
  383. data/test/package/spec_package-reader.rb +85 -0
  384. data/test/package/spec_package-scanner.rb +68 -0
  385. data/test/package/spec_scenario-handler.rb +46 -0
  386. data/test/package/spec_scenario-info.rb +16 -0
  387. data/test/package/spec_scenario-scanner.rb +92 -0
  388. data/test/patch/spec_rinda-patch.rb +1 -1
  389. data/test/patch/spec_uri-patch.rb +1 -1
  390. data/test/{rule-handler → rule-engine}/spec_action-handler.pione +0 -0
  391. data/test/rule-engine/spec_action-handler.rb +94 -0
  392. data/test/rule-engine/spec_data-finder.rb +94 -0
  393. data/test/{tuple-space → rule-engine}/spec_data-finder.yml +39 -28
  394. data/test/rule-engine/spec_empty-handler.rb +170 -0
  395. data/test/{rule-handler → rule-engine}/spec_flow-handler.pione +0 -0
  396. data/test/rule-engine/spec_flow-handler.rb +421 -0
  397. data/test/{rule-handler → rule-engine}/spec_update-criteria.pione +0 -0
  398. data/test/{rule-handler → rule-engine}/spec_update-criteria.rb +16 -12
  399. data/test/{rule-handler → rule-engine}/spec_update-criteria.yml +0 -0
  400. data/test/system/spec_domain-info.rb +13 -9
  401. data/test/system/spec_file-cache.rb +9 -9
  402. data/test/tuple-space/spec_tuple-space-server.rb +42 -40
  403. data/test/tuple/spec_basic-tuple.rb +77 -75
  404. data/test/tuple/spec_data-tuple.rb +4 -4
  405. data/test/tuple/spec_finished-tuple.rb +5 -6
  406. data/test/tuple/spec_message-tuple.rb +3 -3
  407. data/test/tuple/spec_task-tuple.rb +11 -9
  408. data/test/tuple/spec_touch-tuple.rb +3 -3
  409. data/test/tuple/spec_working-tuple.rb +8 -12
  410. data/test/tuple/tuple-behavior.rb +1 -1
  411. data/test/util/data/HelloWorld+v0.1.1.ppg +0 -0
  412. data/test/util/spec_cpu.rb +1 -1
  413. data/test/util/spec_digest.rb +15 -0
  414. data/test/util/spec_evaluatable.rb +3 -3
  415. data/test/util/spec_free-thread-generator.rb +42 -0
  416. data/test/util/spec_ftp-server.rb +4 -9
  417. data/test/util/spec_id.rb +53 -36
  418. data/test/util/spec_indentation.rb +1 -1
  419. data/test/util/spec_ip-address.rb +1 -1
  420. data/test/util/spec_package-parameters-list.rb +10 -9
  421. data/test/util/spec_process-info.rb +2 -2
  422. data/test/util/spec_uuid.rb +1 -1
  423. data/test/util/spec_variable-holdable.rb +1 -1
  424. data/test/util/spec_zip.rb +1 -1
  425. metadata +508 -364
  426. data/example/SerialProcessing/package.yml +0 -5
  427. data/example/SerialProcessing/scenario/scenario.yml +0 -10
  428. data/lib/pione/agent/command-listener.rb +0 -47
  429. data/lib/pione/agent/rule-provider.rb +0 -59
  430. data/lib/pione/agent/trivial-routine-worker.rb +0 -29
  431. data/lib/pione/agent/tuple-space-server-client-life-checker.rb +0 -31
  432. data/lib/pione/command/child-process.rb +0 -56
  433. data/lib/pione/command/daemon-process.rb +0 -10
  434. data/lib/pione/command/front-owner-command.rb +0 -25
  435. data/lib/pione/component.rb +0 -13
  436. data/lib/pione/component/document.rb +0 -88
  437. data/lib/pione/component/package-archiver.rb +0 -92
  438. data/lib/pione/component/package-filename.rb +0 -38
  439. data/lib/pione/component/package-reader.rb +0 -276
  440. data/lib/pione/component/package.rb +0 -199
  441. data/lib/pione/component/rule.rb +0 -206
  442. data/lib/pione/front/task-worker-owner.rb +0 -43
  443. data/lib/pione/front/tuple-space-provider-owner.rb +0 -11
  444. data/lib/pione/model.rb +0 -32
  445. data/lib/pione/model/assignment.rb +0 -120
  446. data/lib/pione/model/basic-model.rb +0 -228
  447. data/lib/pione/model/block.rb +0 -262
  448. data/lib/pione/model/boolean.rb +0 -168
  449. data/lib/pione/model/call-rule.rb +0 -86
  450. data/lib/pione/model/constraints.rb +0 -46
  451. data/lib/pione/model/data-expr.rb +0 -548
  452. data/lib/pione/model/feature-expr.rb +0 -875
  453. data/lib/pione/model/float.rb +0 -105
  454. data/lib/pione/model/integer.rb +0 -166
  455. data/lib/pione/model/keyed-sequence.rb +0 -150
  456. data/lib/pione/model/message.rb +0 -95
  457. data/lib/pione/model/ordinal-sequence.rb +0 -73
  458. data/lib/pione/model/package-expr.rb +0 -53
  459. data/lib/pione/model/parameters.rb +0 -374
  460. data/lib/pione/model/rule-expr.rb +0 -234
  461. data/lib/pione/model/sequence.rb +0 -273
  462. data/lib/pione/model/string.rb +0 -127
  463. data/lib/pione/model/ticket-expr.rb +0 -71
  464. data/lib/pione/model/variable-table.rb +0 -344
  465. data/lib/pione/model/variable.rb +0 -116
  466. data/lib/pione/parser.rb +0 -14
  467. data/lib/pione/parser/block-parser.rb +0 -107
  468. data/lib/pione/parser/common-parser.rb +0 -173
  469. data/lib/pione/parser/document-parser.rb +0 -141
  470. data/lib/pione/parser/expr-parser.rb +0 -354
  471. data/lib/pione/parser/feature-expr-parser.rb +0 -105
  472. data/lib/pione/parser/flow-element-parser.rb +0 -181
  473. data/lib/pione/parser/literal-parser.rb +0 -196
  474. data/lib/pione/parser/rule-definition-parser.rb +0 -158
  475. data/lib/pione/patch/monitor-patch.rb +0 -16
  476. data/lib/pione/rule-handler.rb +0 -14
  477. data/lib/pione/rule-handler/basic-handler.rb +0 -326
  478. data/lib/pione/rule-handler/flow-handler.rb +0 -414
  479. data/lib/pione/rule-handler/update-criteria.rb +0 -175
  480. data/lib/pione/system/global.rb +0 -433
  481. data/lib/pione/transformer.rb +0 -24
  482. data/lib/pione/transformer/block-transformer.rb +0 -28
  483. data/lib/pione/transformer/document-transformer.rb +0 -58
  484. data/lib/pione/transformer/feature-expr-transformer.rb +0 -60
  485. data/lib/pione/transformer/flow-element-transformer.rb +0 -66
  486. data/lib/pione/transformer/literal-transformer.rb +0 -91
  487. data/lib/pione/transformer/rule-definition-transformer.rb +0 -80
  488. data/lib/pione/transformer/transformer-module.rb +0 -39
  489. data/lib/pione/tuple-space/data-finder.rb +0 -155
  490. data/lib/pione/tuple-space/presence-notifier.rb +0 -84
  491. data/lib/pione/tuple-space/tuple-space-provider.rb +0 -85
  492. data/lib/pione/tuple-space/tuple-space-receiver.rb +0 -141
  493. data/lib/pione/tuple-space/tuple-space-server-interface.rb +0 -123
  494. data/lib/pione/tuple.rb +0 -30
  495. data/lib/pione/tuple/agent-tuple.rb +0 -10
  496. data/lib/pione/tuple/attribute-tuple.rb +0 -7
  497. data/lib/pione/tuple/base-location-tuple.rb +0 -9
  498. data/lib/pione/tuple/bye-tuple.rb +0 -9
  499. data/lib/pione/tuple/command-tuple.rb +0 -9
  500. data/lib/pione/tuple/data-null-tuple.rb +0 -14
  501. data/lib/pione/tuple/data-tuple.rb +0 -21
  502. data/lib/pione/tuple/dry-run-tuple.rb +0 -8
  503. data/lib/pione/tuple/exception-tuple.rb +0 -11
  504. data/lib/pione/tuple/finished-tuple.rb +0 -17
  505. data/lib/pione/tuple/foreground-tuple.rb +0 -7
  506. data/lib/pione/tuple/lift-tuple.rb +0 -14
  507. data/lib/pione/tuple/message-tuple.rb +0 -7
  508. data/lib/pione/tuple/process-info-tuple.rb +0 -9
  509. data/lib/pione/tuple/process-log-tuple.rb +0 -13
  510. data/lib/pione/tuple/request-rule-tuple.rb +0 -9
  511. data/lib/pione/tuple/rule-tuple.rb +0 -10
  512. data/lib/pione/tuple/task-tuple.rb +0 -40
  513. data/lib/pione/tuple/task-worker-resource-tuple.rb +0 -9
  514. data/lib/pione/tuple/ticket-tuple.rb +0 -8
  515. data/lib/pione/tuple/touch-tuple.rb +0 -14
  516. data/lib/pione/tuple/working-tuple.rb +0 -13
  517. data/lib/pione/uri-scheme.rb +0 -11
  518. data/lib/pione/util/error-report.rb +0 -27
  519. data/test/agent/spec_command-listener.rb +0 -30
  520. data/test/agent/spec_rule-provider.rb +0 -78
  521. data/test/command/spec_pione-val.domain.dump +0 -0
  522. data/test/component/spec_document.rb +0 -67
  523. data/test/component/spec_package-archiver.rb +0 -27
  524. data/test/component/spec_package-expander.rb +0 -11
  525. data/test/component/spec_package-filename.rb +0 -79
  526. data/test/component/spec_package-reader.rb +0 -100
  527. data/test/component/spec_package.rb +0 -109
  528. data/test/component/spec_rule.rb +0 -140
  529. data/test/model/spec_assignment.rb +0 -52
  530. data/test/model/spec_block.rb +0 -108
  531. data/test/model/spec_boolean.rb +0 -39
  532. data/test/model/spec_boolean.yml +0 -134
  533. data/test/model/spec_call-rule.rb +0 -23
  534. data/test/model/spec_data-expr.rb +0 -361
  535. data/test/model/spec_data-expr.yml +0 -24
  536. data/test/model/spec_data-expr_match.yml +0 -45
  537. data/test/model/spec_feature-expr.rb +0 -333
  538. data/test/model/spec_feature-expr_decide.yml +0 -28
  539. data/test/model/spec_float.rb +0 -23
  540. data/test/model/spec_float.yml +0 -30
  541. data/test/model/spec_integer.rb +0 -23
  542. data/test/model/spec_integer.yml +0 -68
  543. data/test/model/spec_keyed-sequence.rb +0 -5
  544. data/test/model/spec_keyed-sequence.yml +0 -27
  545. data/test/model/spec_message.rb +0 -40
  546. data/test/model/spec_package-expr.rb +0 -19
  547. data/test/model/spec_parameters.rb +0 -103
  548. data/test/model/spec_pione-method.rb +0 -57
  549. data/test/model/spec_rule-expr.rb +0 -28
  550. data/test/model/spec_rule-expr.yml +0 -11
  551. data/test/model/spec_sequence.rb +0 -5
  552. data/test/model/spec_sequence.yml +0 -66
  553. data/test/model/spec_string.rb +0 -47
  554. data/test/model/spec_string.yml +0 -91
  555. data/test/model/spec_ticket-expr.rb +0 -39
  556. data/test/model/spec_variable-table.rb +0 -116
  557. data/test/model/spec_variable.rb +0 -82
  558. data/test/parser/spec_block-parser.rb +0 -5
  559. data/test/parser/spec_block-parser.yml +0 -94
  560. data/test/parser/spec_document-parser.rb +0 -5
  561. data/test/parser/spec_document-parser.yml +0 -77
  562. data/test/parser/spec_expr-parser.rb +0 -6
  563. data/test/parser/spec_feature-expr-parser.rb +0 -32
  564. data/test/parser/spec_feature-expr-parser.yml +0 -25
  565. data/test/parser/spec_flow-element-parser.rb +0 -5
  566. data/test/parser/spec_literal-parser.rb +0 -5
  567. data/test/parser/spec_literal-parser.yml +0 -134
  568. data/test/parser/spec_rule-definition-parser.rb +0 -5
  569. data/test/parser/spec_rule-definition-parser.yml +0 -94
  570. data/test/rule-handler/spec_action-handler.rb +0 -79
  571. data/test/rule-handler/spec_flow-handler.rb +0 -61
  572. data/test/spec_common.rb +0 -14
  573. data/test/spec_object.rb +0 -20
  574. data/test/test-data/package/HelloWorld+v0.1.0.ppg +0 -0
  575. data/test/test-data/package/HelloWorld-gitrepos.zip +0 -0
  576. data/test/test-data/package/HelloWorld/package.yml +0 -6
  577. data/test/test-util.rb +0 -211
  578. data/test/test-util/command.rb +0 -53
  579. data/test/test-util/package.rb +0 -9
  580. data/test/test-util/parser.rb +0 -45
  581. data/test/test-util/transformer.rb +0 -50
  582. data/test/test-util/webserver.rb +0 -43
  583. data/test/transformer/spec_block-transformer.rb +0 -33
  584. data/test/transformer/spec_document-transformer.rb +0 -50
  585. data/test/transformer/spec_expr-transformer.rb +0 -126
  586. data/test/transformer/spec_feature-expr-transformer.rb +0 -21
  587. data/test/transformer/spec_flow-element-transformer.rb +0 -154
  588. data/test/transformer/spec_literal-transformer.rb +0 -64
  589. data/test/transformer/spec_rule-definition-transformer.rb +0 -172
  590. data/test/tuple-space/spec_data-finder.rb +0 -94
  591. data/test/tuple-space/spec_tuple-space-provider.rb +0 -36
  592. data/test/tuple-space/spec_tuple-space-receiver.rb +0 -32
  593. data/test/util/spec_error-report.rb +0 -51
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *~
2
2
  \#*
3
+ .\#*
3
4
 
4
5
  .bundle
5
6
  .EosLog
data/.simplecov CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'coveralls'
2
2
  Coveralls.wear!
3
+ SimpleCov.command_name 'bacon'
3
4
  SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
5
  SimpleCov::Formatter::HTMLFormatter,
5
6
  Coveralls::SimpleCov::Formatter
data/History.txt CHANGED
@@ -1,5 +1,14 @@
1
1
  # History
2
2
 
3
+ ## 0.3.0(2013/10/20)
4
+
5
+ * Improved multi-inheritance package system.
6
+ * Added package database.
7
+ * Added package cache system.
8
+ * Improved language parser and interpreter.
9
+ * Refactored many codes.
10
+ * Improved test coverage.
11
+
3
12
  ## 0.2.2(2013/07/02)
4
13
 
5
14
  * Enabled to load remote package.
data/Rakefile CHANGED
@@ -1,8 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "pione"
3
3
 
4
- $stand_alone = "bin/pione-client --stand-aline"
5
-
6
4
  desc 'generate HTML API documentation'
7
5
  task 'html' do
8
6
  sh 'bundle exec yard doc -o html --hide-void-return --no-api --private'
@@ -13,77 +11,9 @@ task 'html:undoc' do
13
11
  sh 'bundle exec yard stats --list-undoc --no-api --private --compact'
14
12
  end
15
13
 
16
- desc 'count characters in input direcotry'
17
- task 'example:CountChar' do
18
- sh "ruby -I lib %s -i %s %s" % [
19
- $stand_alone,
20
- "example/CountChar/text",
21
- "example/CountChar/CountChar.pione"
22
- ]
23
- end
24
-
25
- desc 'count characters in input direcotry with debug mode'
26
- task 'example:CountChar:debug_mode' do
27
- sh "ruby -I lib %s -i %s -d %s" % [
28
- $stand_alone,
29
- "example/CountChar/text",
30
- "example/CountChar/CountChar.pione"
31
- ]
32
- end
33
-
34
- desc 'count characters by stream'
35
- task 'example:CountCharStream' do
36
- sh "ruby -I lib %s -s %s" % [
37
- $stand_alone,
38
- "example/CountChar/CountCharStream.pione"
39
- ]
40
- end
41
-
42
- desc 'count characters by stream with debug mode'
43
- task 'example:CountCharStream:debug_mode' do
44
- sh "ruby -I lib %s -s -d %s" % [
45
- $stand_alone,
46
- "example/CountChar/CountCharStream.pione"
47
- ]
48
- end
49
-
50
- desc 'sum numbers in file'
51
- task 'example:Sum' do
52
- sh "ruby -I lib %s -i %s %s" % [
53
- $stand_alone,
54
- "example/Sum/input",
55
- "example/Sum/Sum.pione"
56
- ]
57
- end
58
-
59
- desc 'sum numbers in file with debug mode'
60
- task 'example:Sum:debug_mode' do
61
- sh "ruby -I lib %s -i %s -d %s" % [
62
- $stand_alone,
63
- "example/Sum/input",
64
- "example/Sum/Sum.pione"
65
- ]
66
- end
67
-
68
- desc 'fib calc'
69
- task 'example:Fib' do
70
- sh "ruby -I lib %s %s" % [
71
- $stand_alone,
72
- "example/Fib/Fib.pione",
73
- ]
74
- end
75
-
76
- desc 'fib calc with debug mode'
77
- task 'example:Fib:debug' do
78
- sh "ruby -I lib %s -d %s" % [
79
- $stand_alone,
80
- "example/Fib/Fib.pione"
81
- ]
82
- end
83
-
84
14
  desc 'execute basic tests'
85
15
  task 'test' do
86
- sh "bundle exec bacon -I lib -rsimplecov test/parser/spec_*.rb test/transformer/spec_*.rb test/model/spec_*.rb test/log/spec_*.rb test/location/spec_*.rb test/component/spec_*.rb test/util/spec_*.rb test/tuple/spec_*.rb test/uri-scheme/spec_*.rb test/agent/spec_logger.rb test/agent/spec_messenger.rb test/agent/spec_rule-provider.rb test/rule-handler/spec_action-handler.rb test/rule-handler/spec_flow-handler.rb test/rule-handler/spec_update-criteria.rb test/tuple-space/spec_data-finder.rb test/system/spec_*.rb test/command/spec_*.rb"
16
+ sh "bundle exec bacon -rsimplecov -a"
87
17
  end
88
18
 
89
19
  desc 'parser test'
@@ -1,7 +1,8 @@
1
- @ author :: "Keita Yamaguchi"
2
- @ "Fib.pione calculates the value of Fibonacci number."
1
+ .@ PackageName :: "Fib"
2
+ .@ Editor :: "keita.yamaguchi@gmail.com"
3
+ .@ "Fib.pione calculates the value of Fibonacci number."
3
4
 
4
- param ($NUM := 3)
5
+ param $NUM := 3
5
6
 
6
7
  Rule Main
7
8
  output 'result.txt'
@@ -11,21 +12,21 @@ Flow
11
12
  End
12
13
 
13
14
  Rule Fib0
14
- @ "the value of fib(0) is 0"
15
+ .@ "the value of fib(0) is 0"
15
16
  output 'fib0.txt'
16
17
  Action
17
18
  echo -n '0' > fib0.txt
18
19
  End
19
20
 
20
21
  Rule Fib1
21
- @ "the value of fib(1) is 1"
22
+ .@ "the value of fib(1) is 1"
22
23
  output 'fib1.txt'
23
24
  Action
24
25
  echo -n '1' > fib1.txt
25
26
  End
26
27
 
27
28
  Rule Fib
28
- @ "fib(n) is fib(0), fib(1), or fib(n-1) + fib(n-2)"
29
+ .@ "fib(n) is fib(0), fib(1), or fib(n-1) + fib(n-2)"
29
30
  output 'fib{$N}.txt'
30
31
  param $N
31
32
  Flow
@@ -44,7 +45,7 @@ Flow
44
45
  End
45
46
 
46
47
  Rule Calc
47
- @ "calculate the value of fib(n-1) + fib(n-2)"
48
+ .@ "calculate the value of fib(n-1) + fib(n-2)"
48
49
  input 'fib{$P1}.txt'
49
50
  input 'fib{$P2}.txt'
50
51
  output 'fib{$N}.txt'
@@ -56,7 +57,7 @@ Action
56
57
  End
57
58
 
58
59
  Rule Result
59
- @ "make the result"
60
+ .@ "make the result"
60
61
  input 'fib*.txt'
61
62
  output 'result.txt'
62
63
  Action
@@ -1,3 +1,5 @@
1
+ .@ PackageName :: "HelloWorld"
2
+
1
3
  Rule Main
2
4
  output 'message.txt'
3
5
  Action
@@ -0,0 +1,15 @@
1
+ {
2
+ "PackageName": "HelloWorld",
3
+ "Parents": [
4
+
5
+ ],
6
+ "Documents": [
7
+ "HelloWorld.pione"
8
+ ],
9
+ "Scenarios": [
10
+ "scenario"
11
+ ],
12
+ "Bins": [
13
+
14
+ ]
15
+ }
@@ -0,0 +1,2 @@
1
+ .@ ScenarioName :: "HelloWorld"
2
+ .@ ParamSet :: "{}"
@@ -0,0 +1,10 @@
1
+ {
2
+ "ScenarioName": "HelloWorld",
3
+ "ParamSet": "{}",
4
+ "Inputs": [
5
+
6
+ ],
7
+ "Outputs": [
8
+ "output/message.txt"
9
+ ]
10
+ }
@@ -1,3 +1,5 @@
1
+ .@ PackageName :: "SerialProcessing"
2
+
1
3
  Rule Main
2
4
  output '*.a'.all
3
5
  output '*.b'.all
@@ -0,0 +1,15 @@
1
+ {
2
+ "PackageName": "SerialProcessing",
3
+ "Parents": [
4
+
5
+ ],
6
+ "Documents": [
7
+ "SerialProcessing.pione"
8
+ ],
9
+ "Scenarios": [
10
+ "scenario"
11
+ ],
12
+ "Bins": [
13
+
14
+ ]
15
+ }
@@ -0,0 +1 @@
1
+ .@ ScenarioName :: "SerialProcessing Test"
@@ -0,0 +1,10 @@
1
+ {
2
+ "ScenarioName": "SerialProcessing Test",
3
+ "ParamSet": null,
4
+ "Inputs": [
5
+
6
+ ],
7
+ "Outputs": [
8
+
9
+ ]
10
+ }
data/lib/pione.rb CHANGED
@@ -1,9 +1,11 @@
1
+ Thread.abort_on_exception = true
2
+
1
3
  #
2
4
  # load libraries
3
5
  #
4
6
 
5
7
  # bundler
6
- require 'bundler/setup'
8
+ require 'bundler/setup' rescue nil
7
9
 
8
10
  # standard
9
11
  require 'set'
@@ -31,6 +33,7 @@ require 'logger'
31
33
  require 'ostruct'
32
34
  require 'net/ftp'
33
35
  require 'net/http'
36
+ require 'fiber'
34
37
 
35
38
  # gems
36
39
  require 'uuidtools'
@@ -49,59 +52,49 @@ require 'pione/patch/em-ftpd-patch' # patch
49
52
  require 'sys/cpu'
50
53
  require 'structx'
51
54
  require 'syslog-logger'
52
- require 'zipruby'
55
+ require 'zip'
56
+ require 'zip/filesystem'
53
57
  require 'retriable'
54
58
  require 'childprocess'
59
+ require 'lettercase/core_ext'
55
60
 
61
+ # configuration for childprcess
56
62
  ChildProcess.posix_spawn = true
57
63
 
58
64
  #
59
65
  # load pione
60
66
  #
61
67
 
62
- require 'pione/version'
63
- require 'pione/util'
64
- require 'pione/patch'
65
- require 'pione/uri-scheme'
66
- require 'pione/location'
67
- require 'pione/log'
68
- require 'pione/system'
69
-
70
- Pione.module_exec {const_set(:PioneObject, Pione::System::PioneObject)}
71
- Pione.module_exec {const_set(:Global, Pione::System::Global)}
72
-
73
- require 'pione/relay'
74
- require 'pione/tuple-space'
75
- require 'pione/rule-handler.rb'
76
- require 'pione/model'
77
- require 'pione/component'
78
- require 'pione/tuple'
79
- require 'pione/parser'
80
- require 'pione/transformer'
81
- require 'pione/agent'
82
- require 'pione/front'
83
- require 'pione/command'
68
+ require 'pione/version' # PIONE version information
69
+ require 'pione/util' # various helper functions
70
+ require 'pione/patch' # patches for libraries
71
+ require 'pione/location' # location system for data and package
72
+ require 'pione/log' # log and format
73
+ require 'pione/global' # global variable manager
74
+ require 'pione/system' # PIONE system functions
75
+ require 'pione/relay' # relay connection
76
+ require 'pione/package' # package system
77
+ require 'pione/lang' # PIONE languge
78
+ require 'pione/tuple-space' # tuple space functions
79
+ require 'pione/rule-engine' # rule processing behaviors
80
+ require 'pione/agent' # agent system
81
+ require 'pione/front' # command front interface
82
+ require 'pione/command' # command definitions
84
83
 
85
84
  #
86
85
  # other settings
87
86
  #
87
+
88
88
  module Pione
89
- include System
89
+ # expand name spaces
90
90
  include Relay
91
- include Util
92
91
  include Log::MessageLog
93
- include Model
94
92
  include TupleSpace
95
- include Parser
96
- include Transformer
97
93
 
98
94
  extend Util::Evaluatable
99
-
100
- module_function :debug_mode
101
- module_function :debug_mode=
102
- module_function :debug_mode?
103
95
  end
104
96
 
105
- include Pione
106
- Thread.abort_on_exception = true
97
+ # initialize PIONE system
107
98
  Pione::System::Init.new.init
99
+
100
+ # now, we are enable to start processing!
data/lib/pione/agent.rb CHANGED
@@ -3,15 +3,15 @@ module Pione
3
3
  module Agent; end
4
4
  end
5
5
 
6
+ require 'pione/agent/agent-exception'
6
7
  require 'pione/agent/basic-agent'
7
8
  require 'pione/agent/tuple-space-client'
8
- require 'pione/agent/command-listener'
9
+ require 'pione/agent/job-terminator'
9
10
  require 'pione/agent/task-worker'
10
11
  require 'pione/agent/input-generator'
11
- require 'pione/agent/rule-provider'
12
12
  require 'pione/agent/logger'
13
13
  require 'pione/agent/broker'
14
14
  require 'pione/agent/process-manager'
15
- require 'pione/agent/trivial-routine-worker'
16
- require 'pione/agent/tuple-space-server-client-life-checker'
17
15
  require 'pione/agent/messenger'
16
+ require 'pione/agent/tuple-space-provider'
17
+ require 'pione/agent/tuple-space-receiver'
@@ -0,0 +1,52 @@
1
+ module Pione
2
+ module Agent
3
+ # TerminationError is raised when the agent reaches trasition termination.
4
+ class TerminationError < StandardError
5
+ def initialize(agent, states)
6
+ @agent = agent
7
+ @states = states
8
+ end
9
+
10
+ def message
11
+ "agent %s has reached termination([%s])" % [@agent, @states.map{|s| s.to_s}.join(", ")]
12
+ end
13
+ end
14
+
15
+ # TimeoutError is raised when the agent is timeouted.
16
+ class TimeoutError < StandardError
17
+ attr_reader :agent # agent timeouted
18
+ attr_reader :agent_states # agent states
19
+ attr_reader :sec # timeout second
20
+
21
+ def initialize(agent, states, sec)
22
+ @agent = agent
23
+ @states = states
24
+ @sec = sec
25
+ end
26
+
27
+ def message
28
+ sec = @sec ? "(%s sec)" % @sec : ""
29
+ "%s timeouted %s at state [%s]" % [@agent, sec, @states.map{|s| s.to_s}.join(", ")]
30
+ end
31
+ end
32
+
33
+ # ConnectionError is raised when agent is disconnected from other process unexpectedly.
34
+ class ConnectionError < StandardError; end
35
+
36
+ # TupleSpaceError is raised when tuple space is something bad.
37
+ class TupleSpaceError < StandardError; end
38
+
39
+ # Restart is raised when the agent should restart activity.
40
+ class Restart < StandardError; end
41
+
42
+ class UnknownInputGeneratorMethod
43
+ def initialize(name)
44
+ @name = name
45
+ end
46
+
47
+ def message
48
+ "input generator method \"%s\" is unknown" % @name
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,330 +1,337 @@
1
1
  module Pione
2
2
  module Agent
3
- # @api private
4
3
  @table = Hash.new
5
4
 
6
5
  class << self
7
6
  # Returns a class corresponding to the agent type.
8
- # @param [Symbol] type
9
- # agent type
10
- # @return [Pione::Agent::BasicAgent]
11
- # agent class
12
7
  def [](type)
13
8
  @table[type]
14
9
  end
15
10
 
16
11
  # Sets an agent of the system.
17
- # @param [Pione::Agent::BasicAgent] klass
18
- # agent class
19
- # @return [void]
20
12
  def set_agent(klass)
21
13
  @table[klass.agent_type] = klass
22
14
  end
23
15
  end
24
16
 
25
- # Aborting is an exception for aborting agents.
26
- class Aborting < Exception; end
27
-
28
- # TransitionError happens when
29
- class TransitionError < StandardError; end
30
-
31
- # TimeoutStateWaiting happens when not reached expected in time.
32
- class TimeoutStateWaiting < StandardError
33
- # expected status
34
- attr_reader :expected
35
-
36
- # current status
37
- attr_reader :current
38
-
39
- # Creates an exception.
40
- #
41
- # @param [Symbol] expected
42
- # expected state
43
- # @param [Symbol] current
44
- # current state
45
- def initialize(expected, current)
46
- @expected_state = expected
47
- @current_state = current
48
- end
49
-
50
- # @private
51
- def message
52
- msg = "expected state is '%s' but current state is '%s'"
53
- msg % [@expected_state, @current_state]
54
- end
55
- end
56
-
57
17
  # StateTransitionSingleMethod provides state transition singleton methods.
58
18
  module StateTransitionSingletonMethod
59
- # Sets pre-defined states when the module is extended by others.
60
- # @api private
61
- def self.extended(mod)
62
- mod.define_state :initialized
63
- mod.define_state :terminated
64
- mod.define_state :error
65
-
66
- mod.define_state_transition :error => :terminated
67
- end
19
+ # Defines a new transition.
20
+ def define_transition(name)
21
+ @transitions ||= []
22
+ unless @transitions.include?(name)
23
+ @transitions << name
68
24
 
69
- # Defines new agent state.
70
- # @param [Symbol] name
71
- # state name
72
- # @return [void]
73
- def define_state(name)
74
- @states ||= []
75
- unless @states.include?(name)
76
- @states << name
77
-
78
- # define an instance method for checking current state
79
- define_method("#{name}?") do
80
- @__current_state__ == name
81
- end
82
-
83
- # define an instance method for transition
25
+ # define empty transition method
84
26
  unless method_defined?("transit_to_#{name}")
85
- define_method("transit_to_#{name}"){}
27
+ define_method("transit_to_#{name}") {}
86
28
  end
87
29
  end
88
30
  end
89
31
 
90
- # Returns all states.
91
- # @return [Array<Symbol>]
92
- # state name list
93
- def states
94
- @states
32
+ # Returns transition chain table.
33
+ def transition_chain
34
+ @transition_chain ||= {nil => :init}
95
35
  end
96
36
 
97
- # Returns state transition table.
98
- # @return [Hash{Symbol => Symbol}]
99
- # state transition table
100
- def state_transition_table
101
- @__state_transition_table__ ||= {nil => :initialized}
102
- end
103
-
104
- # Defines a state transition.
105
- # @param [Hash{Symbol => Symbol}] data
106
- # state transition as the key value pair of from-state and to-state
107
- # @return [void]
108
- def define_state_transition(data)
109
- table = state_transition_table
110
- table.merge!(data)
37
+ # Define a transition chain.
38
+ def chain(data)
39
+ data.each do |k, v|
40
+ raise ArgumentError.new(k) if not(@transitions.include?(k))
41
+ if not(v.is_a?(Proc))
42
+ (v.is_a?(Array) ? v : [v]).each do |_v|
43
+ raise ArgumentError.new(_v) if not(@transitions.include?(_v))
44
+ end
45
+ end
46
+ end
47
+ transition_chain.merge!(data)
111
48
  end
112
49
 
113
- # Returns exception handler table.
114
- # @return [Hash{Symbol => Symbol}]
115
- # exception handler table
116
- def exception_handler_table
117
- @__exception_handler_table__ ||= {}
50
+ # Return exception handler table.
51
+ def exception_handler
52
+ @exception_handler ||= {}
118
53
  end
119
54
 
120
- # Defines a state for handling exceptions.
121
- # @param [Hash{Exception => Symbol}] data
122
- # exception handler definition
123
- # @return [void]
124
- # @example
125
- # define_exception_handler(StopIetration => :end_process)
55
+ # Define a transition for handling exceptions.
126
56
  def define_exception_handler(data)
127
- table = exception_handler_table
128
- table.merge!(data)
57
+ exception_handler.merge!(data)
129
58
  end
130
59
 
131
60
  # Creates an agent and starts it.
132
- # @param [Array<Object>] args
133
- # arguments of state change
134
61
  def start(*args, &b)
135
- agent = new(*args)
136
- b.call(self) if block_given?
137
- agent.start
138
- return agent
62
+ agent = new(*args, &b)
63
+ return agent.start
64
+ end
65
+ end
66
+
67
+ # BasicAgent is a super class for all PIONE agents.
68
+ class BasicAgent < PioneObject
69
+ include DRbUndumped
70
+ extend StateTransitionSingletonMethod
71
+
72
+ #
73
+ # variables
74
+ #
75
+
76
+ @transitions = Array.new
77
+ @transition_chain = Hash.new
78
+ @exception_handler = Hash.new
79
+
80
+ #
81
+ # default transitions
82
+ #
83
+
84
+ define_transition :init
85
+ define_transition :terminate
86
+
87
+ #
88
+ # class methods
89
+ #
90
+
91
+ def self.inherited(subclass)
92
+ subclass.instance_variable_set(:@transitions, @transitions.clone)
93
+ subclass.instance_variable_set(:@transition_chain, @transition_chain.clone)
94
+ subclass.instance_variable_set(:@exception_handler, @exception_handler.clone)
139
95
  end
140
96
 
141
- # Returns list of exceptions
142
- # @return [Array<Exception>]
143
- # exceptions
144
- def known_exceptions
145
- exception_handler_table.keys
97
+ # Set the agent type.
98
+ def self.set_agent_type(agent_type, klass=nil)
99
+ @agent_type = agent_type
100
+ Agent.set_agent(klass) if klass
146
101
  end
147
- end
148
102
 
149
- # StateTransitionMethod provides state transition methods.
150
- module StateTransitionMethod
151
- # State transition thread.
152
- attr_reader :running_thread
103
+ # Return the agent type.
104
+ def self.agent_type
105
+ @agent_type
106
+ end
107
+
108
+ #
109
+ # instance methods
110
+ #
153
111
 
154
- attr_accessor :show_agent_status
112
+ forward :class, :agent_type
113
+ attr_reader :chain_threads # transition chain thread group
114
+
115
+ def initialize
116
+ @chain_threads = ThreadGroup.new
117
+
118
+ # for wait_until_before method
119
+ @__wait_until_before_mutex__ = Mutex.new
120
+ @__wait_until_before_cv__ = Hash.new {|h, k| h[k] = ConditionVariable.new}
121
+
122
+ # for wait_until_after method
123
+ @__wait_until_after_mutex__ = Mutex.new
124
+ @__wait_until_after_cv__ = Hash.new {|h, k| h[k] = ConditionVariable.new}
125
+ end
155
126
 
156
127
  # Start agent activity.
157
- # @return the agent
158
128
  def start
159
- raise TransitionError.new(current_state) if current_state == :terminated
129
+ unless @chain_threads.list.empty?
130
+ raise TerminationError.new(self, states)
131
+ end
160
132
 
133
+ # save current thread
161
134
  @__owner_thread__ = Thread.current
162
- @__result__ = nil
163
- @running_thread = Thread.new { start_running }
135
+
136
+ # start a new chain thread
137
+ @chain_threads.add(start_running(:init, [], AgentState.new, true))
138
+ @chain_threads.enclose
139
+
164
140
  return self
165
141
  end
166
142
 
167
- # Return state of current agent.
168
- # @return [Symbol]
169
- # state of current agent
170
- def current_state
171
- @__current_state__ ||= nil
172
- end
143
+ # Fire the transtion with inputs.
144
+ def transit(transition, transition_inputs)
145
+ # wake up threads that wait by wait_until_before method
146
+ if @__wait_until_before_cv__.has_key?(transition)
147
+ @__wait_until_before_mutex__.synchronize do
148
+ @__wait_until_before_cv__[transition].broadcast
149
+ end
150
+ end
151
+
152
+ # mark current transition
153
+ Thread.current[:agent_state] =
154
+ AgentState.new(previous: Thread.current[:agent_state].previous, current: transition)
155
+
156
+ # call transition
157
+ result = call_transition_method(transition, transition_inputs)
158
+ result = result.nil? ? [] : result
159
+ result = result.is_a?(Array) ? result : [result]
160
+
161
+ # unmark current transition and mark previous transition
162
+ Thread.current[:agent_state] = AgentState.new(previous: transition, current: nil)
173
163
 
174
- # Transits to the next state.
175
- # @return [void]
176
- def transit
177
- # raise error if the current state is terminated
178
- if current_state == :terminated
179
- raise TransitionError.new(current_state)
164
+ # wake up threads that wait by wait_until_after method
165
+ if @__wait_until_after_cv__.has_key?(transition)
166
+ @__wait_until_after_mutex__.synchronize do
167
+ @__wait_until_after_cv__[transition].broadcast
168
+ end
180
169
  end
181
170
 
182
- state_transition_table = self.class.state_transition_table
183
- begin
184
- next_state = get_next_state(state_transition_table[current_state])
185
- set_current_state(next_state)
186
- p next_state if @show_agent_status
187
- @__result__ = call_transition_method(current_state, *@__result__)
188
- rescue Aborting
189
- raise
190
- rescue Exception => e
191
- if error_state = exception_handler(e)
192
- # known exception : go error state
193
- set_next_state(error_state)
194
- @__result__ = [e]
171
+ return transition, result
172
+ rescue StandardError => e
173
+ # error handling
174
+ if error_transition = get_exception_handler(e)
175
+ raise unless error_transition.is_a?(Symbol)
176
+ return transit(error_transition, [e])
177
+ else
178
+ if @__owner_thread and @__owner_thread__.alive?
179
+ @__owner_thread__.raise e
195
180
  else
196
- # unknown exception : raise it to owner thread
197
- if @__owner_thread__.alive?
198
- @__owner_thread__.raise e
199
- else
200
- raise e
201
- end
181
+ raise e
202
182
  end
203
183
  end
204
184
  end
205
185
 
206
- # Sleep till the agent becomes the state.
207
- def wait_till(state, sec=5)
208
- begin
209
- timeout(sec) do
210
- sleep 0.1 while not(current_state == state)
186
+ # Return agent states.
187
+ def states
188
+ @chain_threads.list.map {|th| th[:agent_state]}
189
+ end
190
+
191
+ # Sleep until before the agent fires the transition.
192
+ def wait_until_before(transition, sec=10)
193
+ timeout(sec) do
194
+ @__wait_until_before_mutex__.synchronize do
195
+ @__wait_until_before_cv__[transition].wait(@__wait_until_before_mutex__)
211
196
  end
212
- rescue Timeout::Error
213
- raise TimeoutStateWaiting.new(state, current_state)
214
197
  end
198
+ rescue Timeout::Error
199
+ raise TimeoutError.new(self, @chain_threads.list.map{|th| th[:agent_state]}, sec)
215
200
  end
216
201
 
217
- # Terminate to transit.
218
- def terminate
219
- begin
220
- res = call_transition_method(:terminated)
221
- rescue DRb::DRbConnError, DRb::ReplyReaderThreadError => e
222
- Util::ErrorReport.warn("raised a connection error when we terminated", self, e, __FILE__, __LINE__)
202
+ def wait_until(transition, sec=10)
203
+ unless @chain_threads.list.any? {|th| th[:agent_state] and th[:agent_state].current == transition}
204
+ wait_until_before(transition, sec)
223
205
  end
224
- # set agent state
225
- set_current_state(:terminated)
226
- return res
227
206
  end
228
207
 
229
- private
230
-
231
- # Set new agent's state.
232
- def set_current_state(state)
233
- @__current_state__ = state
208
+ # Sleep until after the agent fires the transition.
209
+ def wait_until_after(transition, sec=10)
210
+ timeout(sec) do
211
+ @__wait_until_after_mutex__.synchronize do
212
+ @__wait_until_after_cv__[transition].wait(@__wait_until_after_mutex__)
213
+ end
214
+ end
215
+ rescue Timeout::Error => e
216
+ raise TimeoutError.new(self, @chain_threads.list.map{|th| th[:agent_state]}, sec)
234
217
  end
235
218
 
236
- # Return a transition method of the state.
237
- def transition_method(state)
238
- method("transit_to_#{state}")
219
+ # Sleep caller thread until the agent is terminated.
220
+ def wait_until_terminated(sec=10)
221
+ unless terminated?
222
+ wait_until_after(:terminate, sec)
223
+ @chain_threads.list.each {|thread| thread.join}
224
+ end
239
225
  end
240
226
 
241
- # Call a transition method.
242
- def call_transition_method(state, *args)
243
- method = transition_method(state)
244
- arity = method.arity
245
- _args = args[0...arity]
246
- method.call(*_args)
247
- end
227
+ # Terminate the agent activity.
228
+ def terminate
229
+ state = nil
248
230
 
249
- # Returns the handling state for the exception.
250
- def exception_handler(e)
251
- handler = nil
252
- table = self.class.exception_handler_table
253
- e.class.ancestors.each do |mod|
254
- if table.has_key?(mod)
255
- handler = table[mod]
256
- break
231
+ Thread.new {
232
+
233
+ # kill all chain threads
234
+ @chain_threads.list.each do |thread|
235
+ state = thread[:agent_state] # save last state
236
+ unless thread == Thread.current
237
+ thread.kill
238
+ thread.join
239
+ end
257
240
  end
258
- end
259
- return handler
260
- end
261
241
 
262
- # Start to transit agent's state.
263
- # For example, logger should transit initialized, logging, logging, ...
264
- def start_running
265
- begin
266
- while not(terminated?)
267
- transit
242
+ # fire "terminate" transtion
243
+ begin
244
+ Thread.current[:agent_state] = state || AgentState.new
245
+ transit(:terminate, [])
246
+ rescue DRb::DRbConnError, DRbPatch::ReplyReaderError => e
247
+ Log::Debug.warn("raised a connection error when we terminated", self, e)
268
248
  end
269
- rescue Aborting
270
- # do nothing, agent will be dead...
271
- end
249
+ }.join
272
250
  end
273
251
 
274
- def set_next_state(state)
275
- @__next_state__ = state
252
+ # Return true if the agent has been terminated.
253
+ def terminated?
254
+ return (@chain_threads.list.empty? and @chain_threads.enclosed?)
276
255
  end
277
256
 
278
- def get_next_state(state)
279
- if @__next_state__
280
- next_state = @__next_state__
281
- @__next_state__ = nil
282
- return next_state
283
- else
284
- next_state = state.kind_of?(Proc) ? state.call(self, @__result__) : state
285
- unless next_state
286
- msg = "unknown state transition: #{current_state} -> #{state} at #{self}"
287
- raise ScriptError.new(msg)
257
+ private
258
+
259
+ # Start transition chain.
260
+ def start_running(transition, result, state, free)
261
+ thread = free ? Util::FreeThreadGenerator.method(:generate) : Thread.method(:new)
262
+ thread.call do
263
+ begin
264
+ Thread.current[:agent_state] = state
265
+ while true
266
+ # fire the transition
267
+ # NOTE: transition name is maybe changed by the result of firing
268
+ _transition, result, count = transit(transition, result)
269
+ state = Thread.current[:agent_state]
270
+
271
+ begin
272
+ # go next transition
273
+ next_transitions = get_next_transitions(_transition, result)
274
+ transition, *branches = next_transitions
275
+ # handle transition branches
276
+ branches.each {|t| start_running(t, result, state, false)}
277
+ rescue TerminationError
278
+ break # end loop after terminate transition
279
+ end
280
+ end
281
+ rescue Exception => e
282
+ # throw the exception to command's runnning thread
283
+ if Global.command and Global.command.running_thread and Global.command.running_thread.alive?
284
+ Global.command.running_thread.raise e
285
+ else
286
+ raise e
287
+ end
288
288
  end
289
- return next_state
290
289
  end
291
290
  end
292
291
 
293
- # Abort the agent.
294
- def abort
295
- if @running_thread.alive?
296
- # raise Aborting exception
297
- @running_thread.raise Aborting
298
- # wait to stop the thread
299
- @running_thread.join
300
- end if @running_thread
292
+ # Call the transition method.
293
+ def call_transition_method(transition, args)
294
+ method = method("transit_to_#{transition}")
295
+ method.call(*args[0,method.arity])
301
296
  end
302
- end
303
297
 
304
- # BasicAgent is a super class for PIONE agents.
305
- class BasicAgent < PioneObject
306
- include DRbUndumped
307
- extend StateTransitionSingletonMethod
308
- include StateTransitionMethod
298
+ # Get transtion for the exception.
299
+ def get_exception_handler(e)
300
+ table = self.class.exception_handler
301
+ e.class.ancestors.each do |mod|
302
+ return table[mod] if table.has_key?(mod)
303
+ end
304
+ end
309
305
 
310
- def self.inherited(subclass)
311
- states.each {|state| subclass.define_state state }
312
- define_state_transition(state_transition_table)
306
+ # Get next transitions based on transition chain table with previous transition result.
307
+ def get_next_transitions(transition, result)
308
+ next_transitions = self.class.transition_chain[transition]
309
+ if next_transitions.is_a?(Proc)
310
+ next_transitions = next_transitions.call(self, *result)
311
+ end
312
+ if next_transitions.nil? or (next_transitions == [])
313
+ raise TerminationError.new(self, states)
314
+ end
315
+ return next_transitions
313
316
  end
317
+ end
314
318
 
315
- # Set the agent type.
316
- def self.set_agent_type(agent_type)
317
- @agent_type = agent_type
319
+ # AgentState represents a state of agent. The state is a pair of previous
320
+ # transiton and current transition.
321
+ class AgentState < StructX
322
+ member :previous
323
+ member :current
324
+
325
+ def previous?(state)
326
+ previous == state
318
327
  end
319
328
 
320
- # Return the agent type.
321
- def self.agent_type
322
- @agent_type
329
+ def current?(state)
330
+ current == state
323
331
  end
324
332
 
325
- # Return agent type of the object.
326
- def agent_type
327
- self.class.agent_type
333
+ def to_s
334
+ "<%s=>%s>" % [previous, current]
328
335
  end
329
336
  end
330
337
  end