pione 0.1.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 (366) hide show
  1. data/.gitignore +14 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +94 -0
  5. data/Rakefile +118 -0
  6. data/bin/pione-broker +5 -0
  7. data/bin/pione-clean +5 -0
  8. data/bin/pione-client +5 -0
  9. data/bin/pione-eval +111 -0
  10. data/bin/pione-relay +5 -0
  11. data/bin/pione-relay-account-db +5 -0
  12. data/bin/pione-relay-client-db +5 -0
  13. data/bin/pione-search-log +30 -0
  14. data/bin/pione-syntax-checker +5 -0
  15. data/bin/pione-task-worker +5 -0
  16. data/bin/pione-tuple-space-provider +5 -0
  17. data/bin/pione-tuple-space-receiver +5 -0
  18. data/bin/pione-tuple-space-viewer +5 -0
  19. data/demo/demo.rb +311 -0
  20. data/demo/public/base.css +94 -0
  21. data/demo/public/demo.js +107 -0
  22. data/demo/public/index.html +91 -0
  23. data/demo/public/jquery-1.8.3.min.js +2 -0
  24. data/example/CountChar/CountChar.pione +64 -0
  25. data/example/CountChar/misc/CountChar.rb +22 -0
  26. data/example/CountChar/text/aidokushono_insho.txt +32 -0
  27. data/example/CountChar/text/aikokuka_shokan.txt +108 -0
  28. data/example/CountChar/text/carlyle_hakubutsukan.txt +58 -0
  29. data/example/CountChar/text/dark_minister.txt +2440 -0
  30. data/example/CountChar/text/kaikano_otto.txt +61 -0
  31. data/example/CountChar/text/kaikon.txt +30 -0
  32. data/example/CountChar/text/nagashimano_shi.txt +45 -0
  33. data/example/CountChar/text/saikachibuchi.txt +80 -0
  34. data/example/CountChar/text/saikonihonno_josei.txt +91 -0
  35. data/example/CountChar/text/taishojugonenno_bundan.txt +21 -0
  36. data/example/FeatureExample/FeatureExample.pione +7 -0
  37. data/example/Fib/Fib.pione +56 -0
  38. data/example/Fib/FibBC.pione +56 -0
  39. data/example/HelloWorld/HelloWorld.pione +5 -0
  40. data/example/LucasNumber/LucasNumber.pione +64 -0
  41. data/example/MakePair/MakePair.pione +14 -0
  42. data/example/MakePair/data/1.i +0 -0
  43. data/example/MakePair/data/2.i +0 -0
  44. data/example/MakePair/data/3.i +0 -0
  45. data/example/MakePair/data/4.i +0 -0
  46. data/example/MakePair/data/5.i +0 -0
  47. data/example/SieveOfEratosthenes/SieveOfEratosthenes.pione +61 -0
  48. data/example/SingleParticlesWithRef/Makefile +289 -0
  49. data/example/SingleParticlesWithRef/SingleParticlesWithRef.Makefile +153 -0
  50. data/example/SingleParticlesWithRef/SingleParticlesWithRef.pione +116 -0
  51. data/example/SingleParticlesWithRef/SingleParticlesWithRefFull.pione +400 -0
  52. data/example/SingleParticlesWithRef/data/121p-shift-0-0-0.roi +0 -0
  53. data/example/SingleParticlesWithRef/data/121p-shift-0-120-0.roi +0 -0
  54. data/example/SingleParticlesWithRef/data/121p-shift-0-180-0.roi +0 -0
  55. data/example/SingleParticlesWithRef/data/121p-shift-0-240-0.roi +0 -0
  56. data/example/SingleParticlesWithRef/data/121p-shift-0-300-0.roi +0 -0
  57. data/example/SingleParticlesWithRef/data/121p-shift-0-60-0.roi +0 -0
  58. data/example/SingleParticlesWithRef/data/121p-shift-120-0-0.roi +0 -0
  59. data/example/SingleParticlesWithRef/data/121p-shift-120-120-0.roi +0 -0
  60. data/example/SingleParticlesWithRef/data/121p-shift-120-180-0.roi +0 -0
  61. data/example/SingleParticlesWithRef/data/121p-shift-120-240-0.roi +0 -0
  62. data/example/SingleParticlesWithRef/data/121p-shift-120-300-0.roi +0 -0
  63. data/example/SingleParticlesWithRef/data/121p-shift-120-60-0.roi +0 -0
  64. data/example/SingleParticlesWithRef/data/121p-shift-180-0-0.roi +0 -0
  65. data/example/SingleParticlesWithRef/data/121p-shift-180-120-0.roi +0 -0
  66. data/example/SingleParticlesWithRef/data/121p-shift-180-180-0.roi +0 -0
  67. data/example/SingleParticlesWithRef/data/121p-shift-180-240-0.roi +0 -0
  68. data/example/SingleParticlesWithRef/data/121p-shift-180-300-0.roi +0 -0
  69. data/example/SingleParticlesWithRef/data/121p-shift-180-60-0.roi +0 -0
  70. data/example/SingleParticlesWithRef/data/121p-shift-240-0-0.roi +0 -0
  71. data/example/SingleParticlesWithRef/data/121p-shift-240-120-0.roi +0 -0
  72. data/example/SingleParticlesWithRef/data/121p-shift-240-180-0.roi +0 -0
  73. data/example/SingleParticlesWithRef/data/121p-shift-240-240-0.roi +0 -0
  74. data/example/SingleParticlesWithRef/data/121p-shift-240-300-0.roi +0 -0
  75. data/example/SingleParticlesWithRef/data/121p-shift-240-60-0.roi +0 -0
  76. data/example/SingleParticlesWithRef/data/121p-shift-300-0-0.roi +0 -0
  77. data/example/SingleParticlesWithRef/data/121p-shift-300-120-0.roi +0 -0
  78. data/example/SingleParticlesWithRef/data/121p-shift-300-180-0.roi +0 -0
  79. data/example/SingleParticlesWithRef/data/121p-shift-300-240-0.roi +0 -0
  80. data/example/SingleParticlesWithRef/data/121p-shift-300-300-0.roi +0 -0
  81. data/example/SingleParticlesWithRef/data/121p-shift-300-60-0.roi +0 -0
  82. data/example/SingleParticlesWithRef/data/121p-shift-60-0-0.roi +0 -0
  83. data/example/SingleParticlesWithRef/data/121p-shift-60-120-0.roi +0 -0
  84. data/example/SingleParticlesWithRef/data/121p-shift-60-180-0.roi +0 -0
  85. data/example/SingleParticlesWithRef/data/121p-shift-60-240-0.roi +0 -0
  86. data/example/SingleParticlesWithRef/data/121p-shift-60-300-0.roi +0 -0
  87. data/example/SingleParticlesWithRef/data/121p-shift-60-60-0.roi +0 -0
  88. data/example/SingleParticlesWithRef/data/121p-shift-noise-0-0-0.roi +0 -0
  89. data/example/SingleParticlesWithRef/data/121p-shift-noise-0-120-0.roi +0 -0
  90. data/example/SingleParticlesWithRef/data/121p-shift-noise-0-180-0.roi +0 -0
  91. data/example/SingleParticlesWithRef/data/121p-shift-noise-0-240-0.roi +0 -0
  92. data/example/SingleParticlesWithRef/data/121p-shift-noise-0-300-0.roi +0 -0
  93. data/example/SingleParticlesWithRef/data/121p-shift-noise-0-60-0.roi +0 -0
  94. data/example/SingleParticlesWithRef/data/121p-shift-noise-120-0-0.roi +0 -0
  95. data/example/SingleParticlesWithRef/data/121p-shift-noise-120-120-0.roi +0 -0
  96. data/example/SingleParticlesWithRef/data/121p-shift-noise-120-180-0.roi +0 -0
  97. data/example/SingleParticlesWithRef/data/121p-shift-noise-120-240-0.roi +0 -0
  98. data/example/SingleParticlesWithRef/data/121p-shift-noise-120-300-0.roi +0 -0
  99. data/example/SingleParticlesWithRef/data/121p-shift-noise-120-60-0.roi +0 -0
  100. data/example/SingleParticlesWithRef/data/121p-shift-noise-180-0-0.roi +0 -0
  101. data/example/SingleParticlesWithRef/data/121p-shift-noise-180-120-0.roi +0 -0
  102. data/example/SingleParticlesWithRef/data/121p-shift-noise-180-180-0.roi +0 -0
  103. data/example/SingleParticlesWithRef/data/121p-shift-noise-180-240-0.roi +0 -0
  104. data/example/SingleParticlesWithRef/data/121p-shift-noise-180-300-0.roi +0 -0
  105. data/example/SingleParticlesWithRef/data/121p-shift-noise-180-60-0.roi +0 -0
  106. data/example/SingleParticlesWithRef/data/121p-shift-noise-240-0-0.roi +0 -0
  107. data/example/SingleParticlesWithRef/data/121p-shift-noise-240-120-0.roi +0 -0
  108. data/example/SingleParticlesWithRef/data/121p-shift-noise-240-180-0.roi +0 -0
  109. data/example/SingleParticlesWithRef/data/121p-shift-noise-240-240-0.roi +0 -0
  110. data/example/SingleParticlesWithRef/data/121p-shift-noise-240-300-0.roi +0 -0
  111. data/example/SingleParticlesWithRef/data/121p-shift-noise-240-60-0.roi +0 -0
  112. data/example/SingleParticlesWithRef/data/121p-shift-noise-300-0-0.roi +0 -0
  113. data/example/SingleParticlesWithRef/data/121p-shift-noise-300-120-0.roi +0 -0
  114. data/example/SingleParticlesWithRef/data/121p-shift-noise-300-180-0.roi +0 -0
  115. data/example/SingleParticlesWithRef/data/121p-shift-noise-300-240-0.roi +0 -0
  116. data/example/SingleParticlesWithRef/data/121p-shift-noise-300-300-0.roi +0 -0
  117. data/example/SingleParticlesWithRef/data/121p-shift-noise-300-60-0.roi +0 -0
  118. data/example/SingleParticlesWithRef/data/121p-shift-noise-60-0-0.roi +0 -0
  119. data/example/SingleParticlesWithRef/data/121p-shift-noise-60-120-0.roi +0 -0
  120. data/example/SingleParticlesWithRef/data/121p-shift-noise-60-180-0.roi +0 -0
  121. data/example/SingleParticlesWithRef/data/121p-shift-noise-60-240-0.roi +0 -0
  122. data/example/SingleParticlesWithRef/data/121p-shift-noise-60-300-0.roi +0 -0
  123. data/example/SingleParticlesWithRef/data/121p-shift-noise-60-60-0.roi +0 -0
  124. data/example/SingleParticlesWithRef/data/121p-shift.pdb +3381 -0
  125. data/example/SingleParticlesWithRef/data/all.ref2d +0 -0
  126. data/example/SingleParticlesWithRef/data/all.ref3d +0 -0
  127. data/example/Sum/Sum.pione +52 -0
  128. data/example/SyntaxError/call_rule_error.pione +6 -0
  129. data/example/SyntaxError/feature_line_error.pione +7 -0
  130. data/example/SyntaxError/flow_block_error.pione +5 -0
  131. data/example/SyntaxError/input_line_error.pione +6 -0
  132. data/example/SyntaxError/invalid_rule_name.pione +6 -0
  133. data/example/SyntaxError/param_line_error.pione +7 -0
  134. data/example/SyntaxError/variable-binding-error.pione +11 -0
  135. data/lib/pione.rb +241 -0
  136. data/lib/pione/agent/basic-agent.rb +333 -0
  137. data/lib/pione/agent/broker.rb +274 -0
  138. data/lib/pione/agent/command-listener.rb +47 -0
  139. data/lib/pione/agent/input-generator.rb +194 -0
  140. data/lib/pione/agent/logger.rb +65 -0
  141. data/lib/pione/agent/process-manager.rb +38 -0
  142. data/lib/pione/agent/rule-provider.rb +64 -0
  143. data/lib/pione/agent/task-worker.rb +274 -0
  144. data/lib/pione/agent/trivial-routine-worker.rb +28 -0
  145. data/lib/pione/agent/tuple-space-client.rb +146 -0
  146. data/lib/pione/agent/tuple-space-server-client-life-checker.rb +29 -0
  147. data/lib/pione/command-option/basic-option.rb +42 -0
  148. data/lib/pione/command-option/child-process-option.rb +17 -0
  149. data/lib/pione/command-option/common-option.rb +29 -0
  150. data/lib/pione/command-option/daemon-option.rb +12 -0
  151. data/lib/pione/command-option/presence-notifier-option.rb +15 -0
  152. data/lib/pione/command-option/task-worker-owner-option.rb +17 -0
  153. data/lib/pione/command-option/tuple-space-provider-option.rb +26 -0
  154. data/lib/pione/command-option/tuple-space-provider-owner-option.rb +16 -0
  155. data/lib/pione/command-option/tuple-space-receiver-option.rb +12 -0
  156. data/lib/pione/command/basic-command.rb +126 -0
  157. data/lib/pione/command/child-process.rb +43 -0
  158. data/lib/pione/command/daemon-process.rb +18 -0
  159. data/lib/pione/command/front-owner-command.rb +37 -0
  160. data/lib/pione/command/pione-broker.rb +53 -0
  161. data/lib/pione/command/pione-clean.rb +16 -0
  162. data/lib/pione/command/pione-client.rb +273 -0
  163. data/lib/pione/command/pione-relay-account-db.rb +85 -0
  164. data/lib/pione/command/pione-relay-client-db.rb +80 -0
  165. data/lib/pione/command/pione-relay.rb +47 -0
  166. data/lib/pione/command/pione-syntax-checker.rb +103 -0
  167. data/lib/pione/command/pione-task-worker.rb +123 -0
  168. data/lib/pione/command/pione-tuple-space-provider.rb +87 -0
  169. data/lib/pione/command/pione-tuple-space-receiver.rb +55 -0
  170. data/lib/pione/command/pione-tuple-space-viewer.rb +151 -0
  171. data/lib/pione/command/tuple-space-provider-owner.rb +6 -0
  172. data/lib/pione/front/basic-front.rb +64 -0
  173. data/lib/pione/front/broker-front.rb +30 -0
  174. data/lib/pione/front/client-front.rb +28 -0
  175. data/lib/pione/front/relay-front.rb +19 -0
  176. data/lib/pione/front/task-worker-front.rb +16 -0
  177. data/lib/pione/front/task-worker-owner.rb +42 -0
  178. data/lib/pione/front/tuple-space-provider-front.rb +22 -0
  179. data/lib/pione/front/tuple-space-provider-owner.rb +11 -0
  180. data/lib/pione/front/tuple-space-receiver-front.rb +18 -0
  181. data/lib/pione/model/assignment.rb +89 -0
  182. data/lib/pione/model/basic-model.rb +395 -0
  183. data/lib/pione/model/binary-operator.rb +80 -0
  184. data/lib/pione/model/block.rb +233 -0
  185. data/lib/pione/model/boolean.rb +138 -0
  186. data/lib/pione/model/call-rule.rb +69 -0
  187. data/lib/pione/model/data-expr.rb +360 -0
  188. data/lib/pione/model/feature-expr.rb +794 -0
  189. data/lib/pione/model/float.rb +107 -0
  190. data/lib/pione/model/integer.rb +140 -0
  191. data/lib/pione/model/list.rb +104 -0
  192. data/lib/pione/model/message.rb +80 -0
  193. data/lib/pione/model/package.rb +48 -0
  194. data/lib/pione/model/parameters.rb +282 -0
  195. data/lib/pione/model/rule-expr.rb +120 -0
  196. data/lib/pione/model/rule-io.rb +166 -0
  197. data/lib/pione/model/rule.rb +294 -0
  198. data/lib/pione/model/string.rb +111 -0
  199. data/lib/pione/model/undefined-value.rb +24 -0
  200. data/lib/pione/model/variable-table.rb +315 -0
  201. data/lib/pione/model/variable.rb +87 -0
  202. data/lib/pione/parser/block-parser.rb +83 -0
  203. data/lib/pione/parser/common-parser.rb +145 -0
  204. data/lib/pione/parser/document-parser.rb +58 -0
  205. data/lib/pione/parser/error-message.yml +4 -0
  206. data/lib/pione/parser/expr-parser.rb +266 -0
  207. data/lib/pione/parser/feature-expr-parser.rb +105 -0
  208. data/lib/pione/parser/flow-element-parser.rb +181 -0
  209. data/lib/pione/parser/literal-parser.rb +182 -0
  210. data/lib/pione/parser/rule-definition-parser.rb +163 -0
  211. data/lib/pione/parser/syntax-error.rb +61 -0
  212. data/lib/pione/patch/array-patch.rb +3 -0
  213. data/lib/pione/patch/drb-patch.rb +467 -0
  214. data/lib/pione/patch/monitor-patch.rb +16 -0
  215. data/lib/pione/patch/rinda-patch.rb +759 -0
  216. data/lib/pione/patch/uri-patch.rb +66 -0
  217. data/lib/pione/relay/receiver-socket.rb +69 -0
  218. data/lib/pione/relay/relay-account-db.rb +55 -0
  219. data/lib/pione/relay/relay-client-db.rb +53 -0
  220. data/lib/pione/relay/relay-socket.rb +215 -0
  221. data/lib/pione/relay/trampoline.rb +22 -0
  222. data/lib/pione/relay/transmitter-socket.rb +167 -0
  223. data/lib/pione/resource/basic-resource.rb +92 -0
  224. data/lib/pione/resource/dropbox-resource.rb +106 -0
  225. data/lib/pione/resource/ftp.rb +84 -0
  226. data/lib/pione/resource/local.rb +113 -0
  227. data/lib/pione/rule-handler/action-handler.rb +184 -0
  228. data/lib/pione/rule-handler/basic-handler.rb +217 -0
  229. data/lib/pione/rule-handler/flow-handler.rb +339 -0
  230. data/lib/pione/rule-handler/root-handler.rb +23 -0
  231. data/lib/pione/rule-handler/system-handler.rb +13 -0
  232. data/lib/pione/system/common.rb +22 -0
  233. data/lib/pione/system/config.rb +20 -0
  234. data/lib/pione/system/document.rb +81 -0
  235. data/lib/pione/system/file-cache.rb +150 -0
  236. data/lib/pione/system/global.rb +346 -0
  237. data/lib/pione/system/identifier.rb +61 -0
  238. data/lib/pione/system/init.rb +16 -0
  239. data/lib/pione/system/object.rb +35 -0
  240. data/lib/pione/transformer/block-transformer.rb +23 -0
  241. data/lib/pione/transformer/document-transformer.rb +36 -0
  242. data/lib/pione/transformer/expr-transformer.rb +89 -0
  243. data/lib/pione/transformer/feature-expr-transformer.rb +56 -0
  244. data/lib/pione/transformer/flow-element-transformer.rb +66 -0
  245. data/lib/pione/transformer/literal-transformer.rb +76 -0
  246. data/lib/pione/transformer/rule-definition-transformer.rb +62 -0
  247. data/lib/pione/transformer/transformer-module.rb +37 -0
  248. data/lib/pione/tuple-space/data-finder.rb +165 -0
  249. data/lib/pione/tuple-space/presence-notifier.rb +83 -0
  250. data/lib/pione/tuple-space/relay.rb +9 -0
  251. data/lib/pione/tuple-space/tuple-space-provider.rb +85 -0
  252. data/lib/pione/tuple-space/tuple-space-receiver.rb +140 -0
  253. data/lib/pione/tuple-space/tuple-space-server-interface.rb +60 -0
  254. data/lib/pione/tuple-space/tuple-space-server.rb +156 -0
  255. data/lib/pione/tuple-space/update-criteria.rb +96 -0
  256. data/lib/pione/tuple/agent-tuple.rb +10 -0
  257. data/lib/pione/tuple/attribute-tuple.rb +7 -0
  258. data/lib/pione/tuple/base-uri-tuple.rb +9 -0
  259. data/lib/pione/tuple/basic-tuple.rb +317 -0
  260. data/lib/pione/tuple/bye-tuple.rb +9 -0
  261. data/lib/pione/tuple/command-tuple.rb +9 -0
  262. data/lib/pione/tuple/data-tuple.rb +18 -0
  263. data/lib/pione/tuple/dry-run-tuple.rb +8 -0
  264. data/lib/pione/tuple/exception-tuple.rb +11 -0
  265. data/lib/pione/tuple/finished-tuple.rb +17 -0
  266. data/lib/pione/tuple/foreground-tuple.rb +7 -0
  267. data/lib/pione/tuple/log-tuple.rb +14 -0
  268. data/lib/pione/tuple/process-info-tuple.rb +9 -0
  269. data/lib/pione/tuple/request-rule-tuple.rb +9 -0
  270. data/lib/pione/tuple/rule-tuple.rb +10 -0
  271. data/lib/pione/tuple/shift-tuple.rb +13 -0
  272. data/lib/pione/tuple/task-tuple.rb +36 -0
  273. data/lib/pione/tuple/task-worker-resource-tuple.rb +9 -0
  274. data/lib/pione/tuple/working-tuple.rb +13 -0
  275. data/lib/pione/uri-scheme/basic-scheme.rb +40 -0
  276. data/lib/pione/uri-scheme/broadcast-scheme.rb +11 -0
  277. data/lib/pione/uri-scheme/dropbox-scheme.rb +9 -0
  278. data/lib/pione/uri-scheme/local-scheme.rb +28 -0
  279. data/lib/pione/util/error-report.rb +12 -0
  280. data/lib/pione/util/log.rb +79 -0
  281. data/lib/pione/util/message.rb +155 -0
  282. data/lib/pione/util/misc.rb +73 -0
  283. data/lib/pione/util/terminal.rb +78 -0
  284. data/lib/pione/util/waiter-table.rb +53 -0
  285. data/lib/pione/version.rb +3 -0
  286. data/misc/env.sh +2 -0
  287. data/misc/test-drb-stop-service.rb +34 -0
  288. data/misc/test-ensure-and-thread-kill.rb +40 -0
  289. data/misc/test-many-waiters-client.rb +56 -0
  290. data/misc/test-many-waiters-server.rb +14 -0
  291. data/misc/write_and_take_test.png +0 -0
  292. data/misc/write_and_take_test.rb +36 -0
  293. data/pione.gemspec +49 -0
  294. data/test/agent/spec_basic-agent.rb +170 -0
  295. data/test/agent/spec_broker.rb +36 -0
  296. data/test/agent/spec_command-listener.rb +30 -0
  297. data/test/agent/spec_input-generator.rb +123 -0
  298. data/test/agent/spec_logger.rb +71 -0
  299. data/test/agent/spec_rule-provider.rb +65 -0
  300. data/test/agent/spec_task-worker.rb +307 -0
  301. data/test/agent/spec_tuple-space-client.rb +30 -0
  302. data/test/model/spec_assignment.rb +51 -0
  303. data/test/model/spec_binary-operator.rb +39 -0
  304. data/test/model/spec_block.rb +154 -0
  305. data/test/model/spec_boolean.rb +115 -0
  306. data/test/model/spec_call-rule.rb +23 -0
  307. data/test/model/spec_data-expr.rb +312 -0
  308. data/test/model/spec_feature-expr.rb +359 -0
  309. data/test/model/spec_feature-expr.yml +16 -0
  310. data/test/model/spec_float.rb +141 -0
  311. data/test/model/spec_integer.rb +141 -0
  312. data/test/model/spec_list.rb +26 -0
  313. data/test/model/spec_message.rb +42 -0
  314. data/test/model/spec_package.rb +15 -0
  315. data/test/model/spec_parameters.rb +148 -0
  316. data/test/model/spec_rule-expr.rb +66 -0
  317. data/test/model/spec_rule-io.rb +32 -0
  318. data/test/model/spec_rule.rb +158 -0
  319. data/test/model/spec_string.rb +106 -0
  320. data/test/model/spec_variable-table.rb +117 -0
  321. data/test/model/spec_variable.rb +84 -0
  322. data/test/parser/spec_block-parser.rb +5 -0
  323. data/test/parser/spec_block-parser.yml +85 -0
  324. data/test/parser/spec_common-parser.rb +281 -0
  325. data/test/parser/spec_expr-parser.rb +6 -0
  326. data/test/parser/spec_expr-parser.yml +82 -0
  327. data/test/parser/spec_feature-expr-parser.rb +32 -0
  328. data/test/parser/spec_feature-expr-parser.yml +25 -0
  329. data/test/parser/spec_flow-element-parser.rb +5 -0
  330. data/test/parser/spec_flow-element-parser.yml +180 -0
  331. data/test/parser/spec_literal-parser.rb +5 -0
  332. data/test/parser/spec_literal-parser.yml +123 -0
  333. data/test/parser/spec_rule-definition-parser.rb +5 -0
  334. data/test/parser/spec_rule-definition-parser.yml +93 -0
  335. data/test/patch/spec_rinda-patch.rb +32 -0
  336. data/test/patch/spec_uri-patch.rb +23 -0
  337. data/test/rule-handler/spec_action-handler.rb +135 -0
  338. data/test/rule-handler/spec_flow-handler.rb +127 -0
  339. data/test/spec_common.rb +14 -0
  340. data/test/spec_data-finder.rb +88 -0
  341. data/test/spec_data-finder.yml +115 -0
  342. data/test/spec_document.rb +76 -0
  343. data/test/spec_identifier.rb +29 -0
  344. data/test/spec_log.rb +52 -0
  345. data/test/spec_object.rb +20 -0
  346. data/test/spec_resource.rb +73 -0
  347. data/test/spec_update-criteria.rb +83 -0
  348. data/test/test-util.rb +223 -0
  349. data/test/transformer/spec_block-transformer.rb +26 -0
  350. data/test/transformer/spec_expr-transformer.rb +106 -0
  351. data/test/transformer/spec_feature-expr-transformer.rb +21 -0
  352. data/test/transformer/spec_flow-element-transformer.rb +154 -0
  353. data/test/transformer/spec_literal-transformer.rb +58 -0
  354. data/test/transformer/spec_rule-definition-transformer.rb +168 -0
  355. data/test/tuple-space/spec_tuple-space-provider.rb +36 -0
  356. data/test/tuple-space/spec_tuple-space-receiver.rb +32 -0
  357. data/test/tuple-space/spec_tuple-space-server.rb +49 -0
  358. data/test/tuple/spec_basic-tuple.rb +87 -0
  359. data/test/tuple/spec_data-tuple.rb +85 -0
  360. data/test/tuple/spec_finished-tuple.rb +61 -0
  361. data/test/tuple/spec_task-tuple.rb +127 -0
  362. data/test/tuple/spec_working-tuple.rb +58 -0
  363. data/test/uri-scheme/spec_broadcast-scheme.rb +40 -0
  364. data/test/uri-scheme/spec_dropbox-scheme.rb +31 -0
  365. data/test/uri-scheme/spec_local-scheme.rb +69 -0
  366. metadata +660 -0
@@ -0,0 +1,65 @@
1
+ module Pione
2
+ module Agent
3
+ # Logger is an agent for logging in tuple space.
4
+ class Logger < TupleSpaceClient
5
+ set_agent_type :logger
6
+
7
+ def initialize(tuple_space_server, out=$stdout)
8
+ super(tuple_space_server)
9
+ @out = out
10
+ @logs = []
11
+ end
12
+
13
+ define_state :take
14
+ define_state :store
15
+
16
+ define_state_transition :initialized => :take
17
+ define_state_transition :take => :store
18
+ define_state_transition :store => :take
19
+
20
+ define_exception_handler Exception => :terminated
21
+
22
+ # Sleeps till the logger clears logs.
23
+ # @param [Float]
24
+ # timespan for clearing logs
25
+ def wait_to_clear_logs(timespan=0.1)
26
+ while count_tuple(Tuple[:log].any) > 0 || @logs.size > 0
27
+ sleep timespan
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # Transits to the state +take_log+.
34
+ def transit_to_take
35
+ timeout(2) do
36
+ @logs << take(Tuple[:log].any)
37
+ end
38
+ rescue TimeoutError
39
+ # ignore
40
+ end
41
+
42
+ # Transits to the state +store+.
43
+ def transit_to_store
44
+ unless @logs.empty?
45
+ @logs.sort{|a,b| a.timestamp <=> b.timestamp}.each do |log|
46
+ @out.puts log.message.format
47
+ @out.flush
48
+ @out.sync
49
+ end
50
+ @logs = []
51
+ end
52
+ end
53
+
54
+ # State terminated.
55
+ def transit_to_terminated
56
+ super
57
+ unless @out == STDOUT
58
+ Util.ignore_exception { @out.close }
59
+ end
60
+ end
61
+ end
62
+
63
+ set_agent Logger
64
+ end
65
+ end
@@ -0,0 +1,38 @@
1
+ module Pione
2
+ module Agent
3
+ class ProcessManager < TupleSpaceClient
4
+ set_agent_type :process_manager
5
+
6
+ define_state :running
7
+ define_state_transition :initialized => :sleeping
8
+ define_state_transition :sleeping => :running
9
+ define_state_transition :running => :sleeping
10
+
11
+ attr_reader :document
12
+
13
+ def initialize(tuple_space_server, document, params, stream)
14
+ raise ArgumentError unless document.main
15
+ super(tuple_space_server)
16
+ @document = document
17
+ @params = params
18
+ @stream = stream
19
+ end
20
+
21
+ def transit_to_sleeping
22
+ take(Tuple[:command].new("start-root-rule", nil))
23
+ end
24
+
25
+ def transit_to_running
26
+ if handler = @document.root_rule(@params).make_handler(tuple_space_server)
27
+ handler.handle
28
+ else
29
+ user_message "error: no inputs"
30
+ terminate
31
+ end
32
+ terminate unless @stream
33
+ end
34
+ end
35
+
36
+ set_agent ProcessManager
37
+ end
38
+ end
@@ -0,0 +1,64 @@
1
+ module Pione
2
+ module Agent
3
+ class RuleProvider < TupleSpaceClient
4
+
5
+ set_agent_type :rule_provider
6
+
7
+ def initialize(ts_server)
8
+ super(ts_server)
9
+ @table = {}
10
+
11
+ # import system rules
12
+ Model::SYSTEM_RULES.each do |command_rule|
13
+ @table[command_rule.rule_path] = command_rule
14
+ end
15
+ end
16
+
17
+ def read_document(doc)
18
+ doc.rules.each do |rule_path, rule|
19
+ add_rule(rule_path, rule)
20
+ end
21
+ end
22
+
23
+ def add_rule(rule_path, content)
24
+ raise ArgumentError unless content.kind_of?(Rule)
25
+ @table[rule_path] = content
26
+ end
27
+
28
+ # Return known rule pathes.
29
+ def known_rules
30
+ @table.keys
31
+ end
32
+
33
+ define_state :request_waiting
34
+ define_state :rule_loading
35
+
36
+ define_state_transition :initialized => :request_waiting
37
+ define_state_transition :request_waiting => :rule_loading
38
+ define_state_transition :rule_loading => :request_waiting
39
+
40
+ private
41
+
42
+ def transit_to_request_waiting
43
+ return take(Tuple[:request_rule].any)
44
+ end
45
+
46
+ def transit_to_rule_loading(request)
47
+ out = Tuple[:rule].new(rule_path: request.rule_path)
48
+ if known_rule?(request.rule_path)
49
+ out.status = :known
50
+ out.content = @table[request.rule_path]
51
+ else
52
+ out.status = :unknown
53
+ end
54
+ write(out)
55
+ end
56
+
57
+ def known_rule?(rule_path)
58
+ @table.has_key?(rule_path)
59
+ end
60
+ end
61
+
62
+ set_agent RuleProvider
63
+ end
64
+ end
@@ -0,0 +1,274 @@
1
+ module Pione
2
+ module Agent
3
+ # TaskWorker is an agent to process tasks
4
+ class TaskWorker < TupleSpaceClient
5
+ set_agent_type :task_worker
6
+
7
+ class UnknownRuleError < StandardError
8
+ def initialize(task)
9
+ @task = task
10
+ end
11
+
12
+ def message
13
+ "Unknown rule in the task of %s." % @task.inspect
14
+ end
15
+ end
16
+
17
+ class Restart < StandardError
18
+ end
19
+
20
+ @mutex = Mutex.new
21
+
22
+ # Start a task worker agent on a different process.
23
+ # @param [Pione::Front::BasicFront] front
24
+ # caller front server
25
+ # @return [Thread]
26
+ # worker monitor thread
27
+ def self.spawn(front, connection_id, features=nil)
28
+ @mutex.synchronize do
29
+ args = [
30
+ "pione-task-worker",
31
+ "--parent-front", Global.front.uri,
32
+ "--connection-id", connection_id
33
+ ]
34
+ args << "--debug" if Pione.debug_mode?
35
+ args << "--show-communication" if Global.show_communication
36
+ args << "--features" << features if features
37
+ pid = Process.spawn(*args)
38
+ thread = Process.detach(pid)
39
+ # connection check
40
+ while thread.alive?
41
+ break if front.task_worker_front_connection_id.include?(connection_id)
42
+ sleep 0.1
43
+ end
44
+ # error check
45
+ unless thread.alive?
46
+ Process.abort("You cannot run pione-task-worker.")
47
+ end
48
+ return thread
49
+ end
50
+ end
51
+
52
+ define_state :task_waiting
53
+ define_state :task_processing
54
+ define_state :rule_loading
55
+ define_state :task_executing
56
+ define_state :data_outputing
57
+ define_state :task_finishing
58
+
59
+ define_state_transition :initialized => :task_waiting
60
+ define_state_transition :task_waiting => :rule_loading
61
+ define_state_transition :rule_loading => :task_executing
62
+ define_state_transition :task_executing => :data_outputing
63
+ define_state_transition :data_outputing => :task_finishing
64
+ define_state_transition :task_finishing => lambda {|agent, result|
65
+ agent.once ? :terminated : :task_waiting
66
+ }
67
+
68
+ define_exception_handler Restart => :task_waiting
69
+
70
+ attr_reader :task
71
+ attr_reader :rule
72
+ attr_reader :handler_thread
73
+ attr_reader :child_thread
74
+ attr_reader :child_agent
75
+ attr_accessor :once
76
+
77
+ def descendant
78
+ if @child_agent
79
+ [@child_agent] + child_agent.descendant
80
+ else
81
+ []
82
+ end
83
+ end
84
+
85
+ def action?
86
+ @action == true
87
+ end
88
+
89
+ def flow?
90
+ @flow == true
91
+ end
92
+
93
+ private
94
+
95
+ # Creates a task worker agent.
96
+ # @param [TupleSpaceServer] tuple_space_server
97
+ # tuple space server
98
+ # @param [Feature::Expr] features
99
+ # feature set
100
+ def initialize(tuple_space_server, features=Model::Feature::EmptyFeature.new)
101
+ raise ArgumentError.new(features) unless features.kind_of?(Model::Feature::Expr)
102
+ @features = features
103
+ super(tuple_space_server)
104
+
105
+ # ENV
106
+ @env = ENV.clone
107
+ end
108
+
109
+ # Transition method for the state +task_waiting+. The agent takes a +task+
110
+ # tuple and writes a +working+ tuple.
111
+ # @return [Task]
112
+ # task tuple
113
+ def transit_to_task_waiting
114
+ @task = nil
115
+ @rule = nil
116
+ task = take(Tuple[:task].new(features: @features))
117
+ @task = task
118
+ begin
119
+ write(Tuple[:working].new(task.domain, task.digest))
120
+ write(Tuple[:foreground].new(task.domain, task.digest))
121
+ rescue Rinda::RedundantTupleError
122
+ raise Restart.new
123
+ end
124
+ return task
125
+ end
126
+
127
+ # Transition method for the state +rule_loading+.
128
+ # @return [Array<Task, Rule>]
129
+ # task tuple and the rule
130
+ def transit_to_rule_loading(task)
131
+ rule =
132
+ begin
133
+ read0(Tuple[:rule].new(rule_path: task.rule_path))
134
+ rescue Rinda::RequestExpiredError
135
+ log do |msg|
136
+ msg.add_record(agent_type, "action", "request_rule")
137
+ msg.add_record(agent_type, "object", task.rule_path)
138
+ end
139
+ write(Tuple[:request_rule].new(task.rule_path))
140
+ read(Tuple[:rule].new(rule_path: task.rule_path))
141
+ end
142
+ @rule = rule.content
143
+ if rule.status == :known
144
+ return task, rule.content
145
+ else
146
+ raise UnknownRuleError.new(task)
147
+ end
148
+ end
149
+
150
+ # Transition method for the state +task_executing+.
151
+ # @param [Task] task
152
+ # task tuple
153
+ # @param [Rule] rule
154
+ # rule for processing the task
155
+ # @return [Array<Task,RuleHandler,Array<Data>>]
156
+ def transit_to_task_executing(task, rule)
157
+ debug_message_begin("Start Task Execution #{rule.rule_path} by worker(#{uuid})")
158
+
159
+ handler = rule.make_handler(
160
+ tuple_space_server,
161
+ task.inputs,
162
+ task.params,
163
+ task.call_stack
164
+ )
165
+ handler.setenv(ENV)
166
+ @__result_task_execution__ = nil
167
+
168
+ @handler_thread = Thread.new do
169
+ @__result_task_execution__ = handler.handle
170
+ end
171
+
172
+ # make sub workers if flow rule
173
+ @child_thread = Thread.new do
174
+ if rule.flow?
175
+ @flow = true
176
+ @child_agent = nil
177
+ while @handler_thread.alive? do
178
+ if @child_agent.nil? or not(@child_agent.running_thread.alive?)
179
+ debug_message "+++ Create Sub Task worker +++"
180
+ @child_agent = self.class.new(tuple_space_server, @features)
181
+ @child_agent.once = true
182
+ log do |msg|
183
+ msg.add_record(agent_type, "action", "create_sub_task_worker")
184
+ msg.add_record(agent_type, "uuid", uuid)
185
+ msg.add_record(agent_type, "object", @child_agent.uuid)
186
+ end
187
+ take0(Tuple[:foreground].new(task.domain, nil)) rescue true
188
+ @child_agent.start
189
+ else
190
+ tail = descendant.last
191
+ if tail.action?
192
+ tail.running_thread.join
193
+ else
194
+ sleep 1
195
+ end
196
+ end
197
+ end
198
+ write(Tuple[:foreground].new(task.domain, task.digest))
199
+ end
200
+
201
+ if rule.action?
202
+ @action = true
203
+ end
204
+ end
205
+
206
+ # sleep until execution thread will be terminated
207
+ @handler_thread.join
208
+ @child_thread.join
209
+
210
+ @flow = nil
211
+ @action = nil
212
+
213
+ # remove the working tuple
214
+ take0(Tuple[:working].new(task.domain, nil)) rescue true
215
+
216
+ debug_message_end "End Task Execution #{rule.rule_path} by worker(#{uuid})"
217
+
218
+ return task, handler, @__result_task_execution__
219
+ end
220
+
221
+ # State data_outputing.
222
+ # @param [Task] task
223
+ # task tuple
224
+ # @param [RuleHandler] handler
225
+ # rule handler
226
+ # @param [Array<Data>] result
227
+ # result data tuples
228
+ # @return [Array<Task,RuleHandler>]
229
+ def transit_to_data_outputing(task, handler, result)
230
+ result.flatten.each do |output|
231
+ begin
232
+ write(output)
233
+ rescue Rinda::RedundantTupleError
234
+ # ignore
235
+ end
236
+ end
237
+ return task, handler
238
+ end
239
+
240
+ # State task_finishing.
241
+ # @param [Task] task
242
+ # task tuple
243
+ # @param [RuleHandler] handler
244
+ # the handler
245
+ # @return [void]
246
+ def transit_to_task_finishing(task, handler)
247
+ log do |msg|
248
+ msg.add_record(agent_type, "action", "finished_task")
249
+ msg.add_record(agent_type, "uuid", uuid)
250
+ msg.add_record(agent_type, "object", task)
251
+ end
252
+ finished = Tuple[:finished].new(
253
+ handler.domain, :succeeded, handler.outputs, task.digest
254
+ )
255
+ write(finished)
256
+ take0(Tuple[:foreground].new(task.domain, nil)) rescue true
257
+ terminate if @once
258
+ end
259
+
260
+ # State error
261
+ def transit_to_error(e)
262
+ case e
263
+ when UnknownRuleError
264
+ # FIXME
265
+ notify_exception(e)
266
+ else
267
+ super
268
+ end
269
+ end
270
+ end
271
+
272
+ set_agent TaskWorker
273
+ end
274
+ end
@@ -0,0 +1,28 @@
1
+ module Pione
2
+ module Agent
3
+ # TrivialRoutineWorker represents agent class for doing action periodly.
4
+ class TrivialRoutineWorker < BasicAgent
5
+ # state
6
+ define_state :working
7
+
8
+ # transition table
9
+ define_state_transition :initialized => :working
10
+ define_state_transition :working => :working
11
+
12
+ # Creates a worker.
13
+ # @param [Proc] action
14
+ # worker's action as proc object
15
+ # @param [Integer] sec
16
+ # sleeping time
17
+ def initialize(action)
18
+ raise ArgumentError.new(action) unless action.kind_of?(Proc)
19
+ @action = action
20
+ end
21
+
22
+ # Calls the action.
23
+ def transit_to_working
24
+ @action.call
25
+ end
26
+ end
27
+ end
28
+ end