pione 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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