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,339 @@
1
+ module Pione
2
+ module RuleHandler
3
+ # FlowHandler represents a handler for flow actions.
4
+ class FlowHandler < BasicHandler
5
+ def self.message_name
6
+ "Flow"
7
+ end
8
+
9
+ # @api private
10
+ def initialize(*args)
11
+ super
12
+ @data_finder = DataFinder.new(tuple_space_server, @domain)
13
+ @finished = []
14
+ end
15
+
16
+ # Starts to process flow elements. This processes rule application, output
17
+ # search, resource shift, and output validation.
18
+ # @return [void]
19
+ def execute
20
+ # restore data tuples from resource
21
+ restore_data_tuples_from_resource
22
+ # rule application
23
+ apply_rules(@rule.body.eval(@variable_table).elements)
24
+ # find outputs
25
+ find_outputs
26
+ # shift resource
27
+ shift_output_resources
28
+ # check output validation
29
+ validate_outputs
30
+
31
+ return @outputs
32
+ end
33
+
34
+ private
35
+
36
+ # Restores data tuples from the domain resource.
37
+ # @return [void]
38
+ def restore_data_tuples_from_resource
39
+ uri = root? ? @base_uri : @base_uri + (".%s/%s" % @domain.split("_"))
40
+ if Resource[uri].exist?
41
+ Resource[uri].entries.each do |res|
42
+ write(Tuple[:data].new(@domain, res.basename, res.uri.to_s, res.mtime))
43
+ end
44
+ end
45
+ end
46
+
47
+ # Applies target input data to rules.
48
+ # @param [Array<CallRule>] callees
49
+ # elements of call rule lines
50
+ # @return [void]
51
+ def apply_rules(callees)
52
+ user_message_begin("Start Rule Application: %s" % handler_digest)
53
+
54
+ # apply flow-element rules
55
+ while true do
56
+ # find updatable rule applications
57
+ applications = select_updatables(find_applicable_rules(callees))
58
+
59
+ unless applications.empty?
60
+ # push task tuples into tuple space
61
+ distribute_tasks(applications)
62
+ else
63
+ break # finish applications
64
+ end
65
+ end
66
+
67
+ user_message_end("End Rule Application: %s" % handler_digest)
68
+ end
69
+
70
+ # Finds applicable flow-element rules with inputs and variables.
71
+ def find_applicable_rules(callees)
72
+ callees.inject([]) do |combinations, callee|
73
+ # eval callee expr by handling rule context
74
+ callee = callee.eval(@variable_table)
75
+
76
+ # find callee rule
77
+ rule = find_callee_rule(callee)
78
+
79
+ # update callee parameters
80
+ @variable_table.variables.each do |var|
81
+ val = @variable_table.get(var)
82
+ unless val == UndefinedValue.new
83
+ if rule.params.keys.include?(var)
84
+ callee.expr.params.set_safety!(var, val)
85
+ end
86
+ end
87
+ end
88
+
89
+ # eval callee rule by the context
90
+ vtable = callee.expr.params.eval(@variable_table).as_variable_table
91
+ rule = rule.eval(vtable)
92
+
93
+ # check rule status and find combinations
94
+ @data_finder.find(:input, rule.inputs, vtable).each do |res|
95
+ combinations << [
96
+ callee,
97
+ rule,
98
+ res.combination,
99
+ res.variable_table
100
+ ]
101
+ end
102
+
103
+ # find next
104
+ combinations.uniq
105
+ end
106
+ end
107
+
108
+ # Finds the rule of the callee.
109
+ def find_callee_rule(callee)
110
+ return read(Tuple[:rule].new(rule_path: callee.rule_path), 0).content
111
+ rescue Rinda::RequestExpiredError
112
+ debug_message "Request loading a rule #{callee.rule_path}"
113
+ write(Tuple[:request_rule].new(callee.rule_path))
114
+ tuple = read(Tuple[:rule].new(rule_path: callee.rule_path))
115
+
116
+ # check whether known or unknown
117
+ if tuple.status == :known
118
+ return tuple.content
119
+ else
120
+ raise UnknownRule.new(callee.rule_path)
121
+ end
122
+ end
123
+
124
+ # Finds inputs and variables for flow element rules.
125
+ def select_updatables(combinations)
126
+ combinations.select do |callee, rule, inputs, vtable|
127
+ # task domain
128
+ task_domain = ID.domain_id3(rule, inputs, callee)
129
+
130
+ # import finished tuples's data
131
+ import_finished_outputs(task_domain)
132
+
133
+ # find outputs combination
134
+ outputs_combination = @data_finder.find(
135
+ :output,
136
+ rule.outputs.map{|output| output.eval(vtable)},
137
+ vtable
138
+ ).map{|r| r.combination }
139
+
140
+ # no outputs combination means empty list
141
+ outputs_combination = [[]] if outputs_combination.empty?
142
+
143
+ # check update criterias
144
+ outputs_combination.any?{|outputs|
145
+ UpdateCriteria.satisfy?(rule, inputs, outputs, vtable)
146
+ }
147
+ end
148
+ end
149
+
150
+ # Distributes tasks.
151
+ # @param [Array] applications
152
+ # application informations
153
+ # @return [void]
154
+ def distribute_tasks(applications)
155
+ user_message_begin("Start Task Distribution: %s" % handler_digest)
156
+ canceled = []
157
+
158
+ applications.uniq.each do |callee, rule, inputs, vtable|
159
+ # task domain
160
+ task_domain = ID.domain_id3(rule, inputs, callee)
161
+
162
+ # make a task tuple
163
+ task = Tuple[:task].new(
164
+ rule.rule_path,
165
+ inputs,
166
+ callee.expr.params,
167
+ rule.features,
168
+ task_domain,
169
+ @call_stack + [@domain] # current call stack + caller
170
+ )
171
+
172
+ # check if same task exists
173
+ begin
174
+ if need_task?(task)
175
+ # copy input data from the handler domain to task domain
176
+ copy_data_into_domain(inputs, task_domain)
177
+
178
+ # write the task
179
+ write(task)
180
+
181
+ msg = "distributed task %s on %s" % [task.digest, handler_digest]
182
+ user_message(msg, 1)
183
+
184
+ next
185
+ end
186
+ rescue Rinda::RedundantTupleError
187
+ # ignore
188
+ end
189
+
190
+ show "cancel task %s on %s" % [task.digest, handler_digest]
191
+ canceled << task_domain
192
+ end
193
+
194
+ # wait to finish threads
195
+ applications.uniq.each do |callee, rule, inputs, vtable|
196
+ # task domain
197
+ task_domain = ID.domain_id3(rule, inputs, callee)
198
+
199
+ # wait to finish the work
200
+ template = Tuple[:finished].new(
201
+ domain: task_domain,
202
+ status: :succeeded
203
+ )
204
+ finished = read(template)
205
+
206
+ unless canceled.include?(task_domain)
207
+ msg = "finished task %s on %s" % [finished.domain, handler_digest]
208
+ user_message(msg, 1)
209
+ end
210
+
211
+ # copy data from task domain to this domain
212
+ @finished << finished
213
+ copy_data_into_domain(finished.outputs, @domain)
214
+ end
215
+
216
+ user_message_end("End Task Distribution: %s" % handler_digest)
217
+ end
218
+
219
+ # Returns true if we need to write the task into the tuple space.
220
+ # @param [Task] task
221
+ # task tuple
222
+ # @return [Boolean]
223
+ # true if we need to write the task into the tuple space
224
+ def need_task?(task)
225
+ not(exist_task?(task) or working?(task))
226
+ end
227
+
228
+ # Returns true if the task exists in the tuple space already.
229
+ # @param [Task] task
230
+ # task tuple
231
+ # @return [Boolean]
232
+ # true if the task exists in the tuple space already
233
+ def exist_task?(task)
234
+ read0(task)
235
+ return true
236
+ rescue Rinda::RequestExpiredError
237
+ return false
238
+ end
239
+
240
+ # Returns true if any task worker is working on the task.
241
+ # @param [Task] task
242
+ # task tuple
243
+ # @return [Boolean]
244
+ # true if any task worker is working on the task
245
+ def working?(task)
246
+ read0(Tuple[:working].new(domain: task.domain))
247
+ return true
248
+ rescue Rinda::RequestExpiredError
249
+ return false
250
+ end
251
+
252
+ # Find outputs from the domain.
253
+ # @return [void]
254
+ def find_outputs
255
+ @rule.outputs.each_with_index do |output, i|
256
+ output = output.eval(@variable_table)
257
+ tuples = read_all(Tuple[:data].new(domain: @domain))
258
+ case output.modifier
259
+ when :all
260
+ @outputs[i] = tuples.find_all {|data| output.match(data.name)}
261
+ when :each
262
+ @outputs[i] = tuples.find {|data| output.match(data.name)}
263
+ end
264
+ end
265
+ end
266
+
267
+ # Shifts output resource locations.
268
+ # @return [void]
269
+ def shift_output_resources
270
+ # cheker for double shift
271
+ shifted = []
272
+ # shift output resources
273
+ @outputs.flatten.compact.each do |output|
274
+ old_uri = URI.parse(output.uri)
275
+ new_uri = URI.parse(make_output_resource_uri(output.name).to_s)
276
+ unless new_uri.path == old_uri.path or shifted.include?(old_uri.path)
277
+ # shift resource
278
+ Resource[new_uri].shift_from(Resource[old_uri])
279
+ # shift cache if the old is cached in this machine
280
+ FileCache.shift(old_uri, new_uri)
281
+ # write shift tuple
282
+ write(Tuple[:shift].new(old_uri.to_s, new_uri.to_s))
283
+ # push moved path
284
+ shifted << old_uri.path
285
+ end
286
+ end
287
+ end
288
+
289
+ # Validates outputs size.
290
+ def validate_outputs
291
+ # size check
292
+ if @rule.outputs.size > 0 and not(@rule.outputs.size == @outputs.size)
293
+ raise RuleExecutionError.new(self)
294
+ end
295
+ # nil check
296
+ if @outputs.any?{|tuple| tuple.nil?}
297
+ raise RuleExecutionError.new(self)
298
+ end
299
+
300
+ # empty list check
301
+ if @outputs.any?{|tuple| tuple.kind_of?(Array) && tuple.empty?}
302
+ raise RuleExecutionError.new(self)
303
+ end
304
+ end
305
+
306
+ # Imports finished tuple's outputs from the domain.
307
+ # @param [String] task_domain
308
+ # target task domain
309
+ # @return [void]
310
+ def import_finished_outputs(task_domain)
311
+ return if @finished.any?{|t| t.domain == task_domain}
312
+ if task_domain != @domain
313
+ template = Tuple[:finished].new(
314
+ domain: task_domain,
315
+ status: :succeeded
316
+ )
317
+ finished = read0(template)
318
+ copy_data_into_domain(finished.outputs, @domain)
319
+ end
320
+ rescue Rinda::RequestExpiredError
321
+ # ignore
322
+ end
323
+
324
+ # Copy data into specified domain and return the tuple list
325
+ def copy_data_into_domain(src_data, dest_domain)
326
+ src_data.flatten.compact.map do |d|
327
+ new_data = d.clone
328
+ new_data.domain = dest_domain
329
+ begin
330
+ write(new_data)
331
+ rescue Rinda::RedundantTupleError
332
+ # ignore
333
+ end
334
+ new_data
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
@@ -0,0 +1,23 @@
1
+ module Pione
2
+ module RuleHandler
3
+ # RootHandler is a special handler for RootRule.
4
+ class RootHandler < FlowHandler
5
+ def self.message_name
6
+ "Root"
7
+ end
8
+
9
+ # @api private
10
+ def execute
11
+ # import initial input tuples from input domain
12
+ copy_data_into_domain(@inputs.flatten, @domain)
13
+ # execute the rule
14
+ result = super
15
+ # export outputs to output domain
16
+ copy_data_into_domain(@outputs.flatten, '/output')
17
+
18
+ return result
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,13 @@
1
+ module Pione
2
+ module RuleHandler
3
+ class SystemHandler < BasicHandler
4
+ def self.message_name
5
+ "System"
6
+ end
7
+
8
+ def execute
9
+ @rule.body.call(tuple_space_server)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ module Pione
2
+ module System
3
+ # Starts finalization process for PIONE system. It collects all pione
4
+ # objects from object space and finalize it.
5
+ # @return [void]
6
+ def finalize
7
+ # finalize all innocent white objects
8
+ ObjectSpace.each_object(PioneObject) do |obj|
9
+ obj.finalize
10
+ end
11
+ end
12
+ module_function :finalize
13
+
14
+ # Sets signal trap for the system.
15
+ # @return [void]
16
+ def set_signal_trap
17
+ finalizer = Proc.new { finalize }
18
+ Signal.trap(:INT, finalizer)
19
+ end
20
+ module_function :set_signal_trap
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ module Pione
2
+ module System
3
+ # Config represents a PIONE system configuration.
4
+ class Config < PioneObject
5
+ extend Forwardable
6
+
7
+ attr_reader :path
8
+ def_delegator :@table, "[]"
9
+
10
+ # Creates a new configuration.
11
+ # @param [Hash] data
12
+ # preset configuration table
13
+ def initialize(path)
14
+ @path = Pathname.new(path)
15
+ @table = @path.exist? ? YAML.load(@path.read) : {}
16
+ raise TypeError.new(@path) unless @table.kind_of?(Hash)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,81 @@
1
+ module Pione
2
+ module System
3
+ class Document < PioneObject
4
+ # Add ruby shebang line.
5
+ def ruby(str, charset=nil)
6
+ res = "#!/usr/bin/env ruby\n"
7
+ res << "# -*- coding: #{charset} -*-\n" if charset
8
+ return res + str
9
+ end
10
+
11
+ # Load a rule document and return it.
12
+ def self.load(filepath)
13
+ parse(File.read(filepath))
14
+ end
15
+
16
+ # Parse a rule document string.
17
+ def self.parse(src)
18
+ # parse the document and build the model
19
+ parser = Parser::DocumentParser.new
20
+ transformer = Transformer::DocumentTransformer.new
21
+ toplevels = transformer.apply(parser.parse(src))
22
+
23
+ # rules and assignments
24
+ rules = toplevels.select{|elt| elt.kind_of?(Rule)}
25
+ assignments = toplevels.select{|elt| elt.kind_of?(Assignment)}
26
+ assignments.each {|assignment| assignment.set_toplevel(true)}
27
+
28
+ # make document parameters
29
+ params = assignments.inject(VariableTable.empty) do |vtable, a|
30
+ vtable.tap{|t| t.set(a.variable, a.expr)}
31
+ end.to_params
32
+
33
+ # set document parameters into rules
34
+ rules.each do |rule|
35
+ rule.params.merge!(params)
36
+ end
37
+
38
+ # make rule table
39
+ table = rules.inject({}) do |tbl, rule|
40
+ tbl.tap{|x| x[rule.rule_path] = rule}
41
+ end
42
+ return new(table, params)
43
+ end
44
+
45
+ attr_reader :rules
46
+
47
+ # Creates a document.
48
+ def initialize(rules, params)
49
+ @rules = rules
50
+ @params = params
51
+ instance_eval(&b) if block_given?
52
+ end
53
+
54
+ # Returns the named rule.
55
+ # @param [String] name
56
+ # rule path
57
+ # @return [Pione::Model::Rule]
58
+ def [](name)
59
+ @rules[name].params.merge!(@params)
60
+ @rules[name]
61
+ end
62
+
63
+ # Returns main rule of main package.
64
+ # @return [Rule]
65
+ # main rule of main package
66
+ def main
67
+ @rules["&main:Main"].params.merge!(@params)
68
+ @rules["&main:Main"]
69
+ end
70
+
71
+ # Returns root rule.
72
+ # @param [Parameters] params
73
+ # root root parameter
74
+ # @return [RootRule]
75
+ # root rule
76
+ def root_rule(params)
77
+ Rule::RootRule.new(main, params.merge(@params))
78
+ end
79
+ end
80
+ end
81
+ end