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,62 @@
1
+ module Pione
2
+ module Transformer
3
+ module RuleDefinitionTransformer
4
+ include TransformerModule
5
+
6
+ def check_model_type(obj, pione_model_type)
7
+ pione_model_type.match(obj.pione_mode_type)
8
+ end
9
+ module_function :check_model_type
10
+
11
+ # rule_definition
12
+ rule(:rule_definition => {
13
+ :rule_header => simple(:rule_expr),
14
+ :rule_conditions => sequence(:conditions),
15
+ :block => simple(:block) }) {
16
+ inputs = conditions.select{|c| c.type == :input}.map{|c| c.obj}
17
+ outputs = conditions.select{|c| c.type == :output}.map{|c| c.obj}
18
+ params = Parameters.merge(
19
+ *conditions.select{|c| c.type == :param}.map{|c| c.obj}
20
+ )
21
+ features = Feature::AndExpr.new(
22
+ *conditions.select{|c| c.type == :feature}.map{|c| c.obj}
23
+ )
24
+ condition = RuleCondition.new(inputs, outputs, params, features)
25
+ case block
26
+ when ActionBlock
27
+ ActionRule
28
+ when FlowBlock
29
+ FlowRule
30
+ end.new(rule_expr, condition, block)
31
+ }
32
+
33
+ ConditionLine = Struct.new(:type, :obj)
34
+
35
+ # input_line
36
+ rule(:input_line => simple(:data_expr)) {
37
+ TypeDataExpr.check(data_expr)
38
+ ConditionLine.new(:input, data_expr)
39
+ }
40
+
41
+ # output_line
42
+ rule(:output_line => simple(:data_expr)) {
43
+ TypeDataExpr.check(data_expr)
44
+ ConditionLine.new(:output, data_expr)
45
+ }
46
+
47
+ # param_line
48
+ rule(:param_line => simple(:param)) {
49
+ unless TypeAssignment.match(param) or TypeParameters.match(param)
50
+ raise PioneModelTypeError.new(param, TypeAssignment)
51
+ end
52
+ ConditionLine.new(:param, param)
53
+ }
54
+
55
+ # feature_line
56
+ rule(:feature_line => simple(:feature)) {
57
+ TypeFeature.check(feature)
58
+ ConditionLine.new(:feature, feature)
59
+ }
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,37 @@
1
+ module Pione
2
+ module Transformer
3
+ module TransformerModule
4
+ class << self
5
+ def included(mod)
6
+ singleton = class << mod; self; end
7
+ create_pair_by(Parslet, Parslet::Transform).each do |name, orig|
8
+ singleton.__send__(:define_method, name) do |*args, &b|
9
+ orig.__send__(name, *args, &b)
10
+ end
11
+ end
12
+
13
+ class << mod
14
+ def included(klass)
15
+ name = :@__transform_rules
16
+ klass_rules = klass.instance_variable_get(name)
17
+ klass_rules = klass_rules ? klass_rules + rules : rules
18
+ klass.instance_variable_set(name, klass_rules)
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def create_pair_by(*mods)
26
+ mods.inject([]) do |list, mod|
27
+ list += create_pair(mod)
28
+ end
29
+ end
30
+
31
+ def create_pair(mod)
32
+ (mod.methods.sort - Object.methods.sort).map{|m| [m, mod]}
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,165 @@
1
+ module Pione
2
+ # DataFinder finds data tuples from tuple space server.
3
+ class DataFinder < PioneObject
4
+
5
+ # DataFinderResult represents an element of DataFinder#find results. The
6
+ # attribute +combination+ is a rule inputs combination and +variable_table+
7
+ # is a variable table including variables for found date set.
8
+ class DataFinderResult < Struct.new(:combination, :variable_table)
9
+ # Returns true if the combination is empty.
10
+ # @return [Boolean]
11
+ # true if the result is empty
12
+ def empty?
13
+ self[:combination].empty?
14
+ end
15
+ end
16
+
17
+ include TupleSpaceServerInterface
18
+
19
+ # Creates a new finder.
20
+ # @param [TupleSpaceServer] ts_server
21
+ # tuple space server
22
+ # @param [String] domain
23
+ # target data domain to find
24
+ def initialize(ts_server, domain)
25
+ set_tuple_space_server(ts_server)
26
+ @domain = domain
27
+ end
28
+
29
+ # Find tuple combinations by data expressions from tuple space server.
30
+ # @param [Symbol] type
31
+ # :input if target date is for input or :output
32
+ # @param [DataExpr] exprs
33
+ # data-expr list
34
+ # @param [VariableTable] vtable
35
+ # variabel table
36
+ # @return [DataFinderResult]
37
+ # result data set
38
+ def find(type, exprs, vtable)
39
+ raise ArgumentError.new(vtable) unless vtable.kind_of?(VariableTable)
40
+
41
+ # variable table
42
+ new_vtable = VariableTable.new(vtable)
43
+ case type
44
+ when :input
45
+ # alias for I
46
+ new_vtable.set(Variable.new("INPUT"), Variable.new("I"))
47
+ when :output
48
+ # alias for O
49
+ new_vtable.set(Variable.new("OUTPUT"), Variable.new("O"))
50
+ end
51
+
52
+ find_rec(type, exprs, 1, new_vtable)
53
+ end
54
+
55
+ private
56
+
57
+ # Finds all data tuples by the expression from a tuple space server.
58
+ # @param [DataExpr] expr
59
+ # query expression of data
60
+ # @return [DataFinderResult]
61
+ # query result
62
+ # @api private
63
+ def find_by_expr(expr)
64
+ expr = DataExpr.new(expr) if expr.kind_of?(String)
65
+ query = Tuple[:data].new(name: expr, domain: @domain)
66
+ return tuple_space_server.read_all(query)
67
+ end
68
+
69
+ # Find input tuple combinatioins recursively.
70
+ def find_rec(type, exprs, index, vtable)
71
+ # return empty when we reach the recuirsion end
72
+ return [DataFinderResult.new([], vtable)] if exprs.empty?
73
+
74
+ # expand variables and compile to regular expression
75
+ head = exprs.first.eval(vtable)
76
+ tail = exprs.drop(1)
77
+
78
+ # find an input data by name from tuple space server
79
+ tuples = find_by_expr(head)
80
+
81
+ # make combination results
82
+ prefix = (type == :input ? "I" : "O")
83
+ if head.all?
84
+ # case all modifier
85
+ new_vtable =
86
+ make_auto_variables_by_all(prefix, head, tuples, vtable)
87
+ unless tuples.empty?
88
+ return find_rec_sub(type, tail, index, tuples, new_vtable)
89
+ end
90
+ else
91
+ # case each modifier
92
+ return tuples.map {|tuple|
93
+ args = [prefix, head, tuple, vtable, index]
94
+ new_vtable = make_auto_variables_by_each(*args)
95
+ find_rec_sub(type, tail, index, tuple, new_vtable)
96
+ }.flatten
97
+ end
98
+
99
+ # available combinations were not found
100
+ return []
101
+ end
102
+
103
+ # @api private
104
+ def find_rec_sub(type, tail, index, data, vtable)
105
+ find_rec(type, tail, index+1, vtable).map do |res|
106
+ new_combination = res.combination.unshift(data)
107
+ new_vtable = res.variable_table
108
+ DataFinderResult.new(new_combination, new_vtable)
109
+ end
110
+ end
111
+
112
+ # Make auto-variables by the name modified 'all'.
113
+ # @api private
114
+ def make_auto_variables_by_all(prefix, expr, tuples, vtable)
115
+ # create new table
116
+ new_vtable = VariableTable.new(vtable)
117
+ # variable
118
+ var = Variable.new(prefix)
119
+
120
+ # setup rule-io list
121
+ list = new_vtable.get(var)
122
+ list = RuleIOList.new unless list
123
+ io_list = RuleIOList.new
124
+ new_vtable.set!(var, list.add(io_list))
125
+
126
+ # convert each tuples
127
+ tuples.each do |tuple, i|
128
+ elt = RuleIOElement.new(PioneString.new(tuple.name))
129
+ elt.uri = PioneString.new(tuple.uri)
130
+ elt.match = PioneList.new(
131
+ *expr.match(tuple.name).to_a.map{|m| PioneString.new(m)}
132
+ )
133
+ io_list.add!(elt)
134
+ end
135
+
136
+ return new_vtable
137
+ end
138
+
139
+ # Make auto-variables by the name modified 'each'.
140
+ # @api private
141
+ def make_auto_variables_by_each(prefix, expr, tuple, vtable, index)
142
+ # create new table
143
+ new_vtable = VariableTable.new(vtable)
144
+ # variable
145
+ var = Variable.new(prefix)
146
+ # matched data
147
+ md = expr.match(tuple.name).to_a
148
+
149
+ # setup rule-io list
150
+ list = new_vtable.get(var)
151
+ list = RuleIOList.new unless list
152
+ elt = RuleIOElement.new(PioneString.new(tuple.name))
153
+ elt.uri = PioneString.new(tuple.uri)
154
+ elt.match = PioneList.new(*md.map{|d| PioneString.new(d)})
155
+ new_vtable.set!(var, list.add(elt))
156
+
157
+ # set special variable if index equals 1
158
+ if prefix == 'I' && index == 1
159
+ new_vtable.set(Variable.new("*"), PioneString.new(md[1]))
160
+ end
161
+
162
+ return new_vtable
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,83 @@
1
+ module Pione
2
+ module TupleSpace
3
+ class PresenceNotifier < PioneObject
4
+ def self.inherited(subclass)
5
+ subclass.instance_variable_set(:@monitor, Monitor.new)
6
+ end
7
+
8
+ def self.command_name
9
+ @command_name
10
+ end
11
+
12
+ def self.set_command_name(name)
13
+ @command_name = name
14
+ end
15
+
16
+ def self.notifier_uri
17
+ @notifier_uri.call
18
+ end
19
+
20
+ def self.set_notifier_uri(proc)
21
+ @notifier_uri = proc
22
+ end
23
+
24
+ # Creates the tuple space provider as new process.
25
+ # @return [BasicFront]
26
+ # tuple space provider or receiver front
27
+ def self.spawn
28
+ user_message "create process for %s" % command_name
29
+ # create provider process
30
+ args = [command_name, '--parent-front', Global.front.uri]
31
+ args << "--debug" if Pione.debug_mode?
32
+ args << "--show-communication" if Global.show_communication
33
+ args << "--show-presence-notifier" if Global.show_presence_notifier
34
+ if self == TupleSpaceReceiver
35
+ args << "--presence-port"
36
+ args << Global.presence_port.to_s
37
+ end
38
+ args << "--my-ip-address"
39
+ args << Global.my_ip_address
40
+ if self == TupleSpaceProvider
41
+ Global.presence_notification_addresses.each do |address|
42
+ args << "--presence-notification-address"
43
+ args << address.to_s
44
+ end
45
+ end
46
+ pid = Process.spawn(*args)
47
+ thread = Process.detach(pid)
48
+ # wait that the provider starts up
49
+ while thread.alive?
50
+ begin
51
+ front = DRbObject.new_with_uri(notifier_uri)
52
+ break if front.uuid
53
+ rescue
54
+ sleep 0.1
55
+ end
56
+ end
57
+ if thread.alive?
58
+ return front
59
+ else
60
+ # failed to run pione-tuple-space-provider
61
+ Process.abort("You cannot run %s." % command_name)
62
+ end
63
+ end
64
+
65
+ # Returns the provider instance.
66
+ # @return [PresenceNotifier]
67
+ # tuple space provider or receiver instance as druby object
68
+ def self.instance
69
+ @monitor.synchronize do
70
+ # get provider reference
71
+ begin
72
+ front = DRbObject.new_with_uri(notifier_uri)
73
+ front.uuid
74
+ front
75
+ rescue
76
+ # create new provider
77
+ self.spawn
78
+ end.presence_notifier
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,9 @@
1
+ module Pione
2
+ module TupleSpace
3
+ class Relay < PioneObject
4
+ def initialize
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,85 @@
1
+ module Pione
2
+ module TupleSpace
3
+ # TupleSpaceProvider provides tuple space server's location to tuple space
4
+ # receivers.
5
+ class TupleSpaceProvider < PresenceNotifier
6
+ include DRbUndumped
7
+
8
+ set_command_name "pione-tuple-space-provider"
9
+ set_notifier_uri Proc.new {Global.tuple_space_provider_uri}
10
+
11
+ attr_accessor :tuple_space_servers
12
+
13
+ # Creatas a new server. This method assumes to be called from
14
+ # pione-tuple-space-provider command only. So you should not initialize
15
+ # server directly.
16
+ def initialize
17
+ super
18
+
19
+ # set variables
20
+ @tuple_space_servers = []
21
+ @terminated = false
22
+
23
+ # start agents
24
+ @keeper = Agent::TrivialRoutineWorker.new(
25
+ Proc.new do
26
+ send_packet
27
+ sleep 5
28
+ end
29
+ )
30
+ end
31
+
32
+ def start
33
+ @keeper.start
34
+ end
35
+
36
+ def add_tuple_space_server(tuple_space_server)
37
+ @tuple_space_servers << tuple_space_server
38
+ end
39
+
40
+ # Sends empty tuple space server list.
41
+ def terminate
42
+ return unless @terminated
43
+ @terminated = true
44
+ @keeper_agent.terminate
45
+ end
46
+
47
+ def terminated?
48
+ @terminated
49
+ end
50
+
51
+ alias :finalize :terminate
52
+
53
+ private
54
+
55
+ # Sends presence notification to tuple space receivers as UDP packet.
56
+ # @return [void]
57
+ def send_packet
58
+ # setup reference data
59
+ port = /druby:\/\/(.*):(\d+)/.match(Global.front.uri)[2].to_i
60
+ @ref ||= Marshal.dump(port)
61
+ # open a socket
62
+ socket = UDPSocket.open
63
+ # address to send broadcast
64
+ addresses = Global.presence_notification_addresses
65
+ begin
66
+ if Global.show_presence_notifier
67
+ args = [Global.front.uri, addresses.join(", "), Time.now]
68
+ puts "sent presence notifier from %s to %s at %s" % args
69
+ end
70
+ # send packet
71
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
72
+ addresses.each {|addr| socket.send(@ref, 0, addr.host, addr.port)}
73
+ rescue => e
74
+ if Global.show_presence_notifier
75
+ puts "tuple-space-provider: something is bad..."
76
+ Util::ErrorReport.print(e)
77
+ end
78
+ ensure
79
+ # close the socket always
80
+ socket.close
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,140 @@
1
+ module Pione
2
+ module TupleSpace
3
+ class TupleSpaceReceiver < PresenceNotifier
4
+ class InstanceError < StandardError; end
5
+
6
+ set_command_name "pione-tuple-space-receiver"
7
+ set_notifier_uri Proc.new {Global.tuple_space_receiver_uri}
8
+
9
+ def self.start(broker)
10
+ instance.register(broker)
11
+ end
12
+
13
+ attr_accessor :drb_service
14
+
15
+ def initialize
16
+ @brokers = []
17
+ @tuple_space_servers = {}
18
+ @socket = open_socket
19
+
20
+ # lock
21
+ @tuple_space_server_lock = Mutex.new
22
+ @broker_lock = Mutex.new
23
+
24
+ # subagents
25
+ @tuple_space_server_receiver =
26
+ Agent::TrivialRoutineWorker.new(Proc.new{receive_tuple_space_servers})
27
+ @updater = Agent::TrivialRoutineWorker.new(Proc.new{update_tuple_space_servers})
28
+ end
29
+
30
+ # Registers the agent.
31
+ def register(agent)
32
+ @broker_lock.synchronize { @brokers << agent }
33
+ end
34
+
35
+ # Start to receive tuple space servers.
36
+ def start
37
+ @tuple_space_server_receiver.start
38
+ @updater.start
39
+ end
40
+
41
+ def tuple_space_servers
42
+ @tuple_space_server_lock.synchronize do
43
+ @tuple_space_servers.keys
44
+ end
45
+ end
46
+
47
+ # Send empty tuple space server list.
48
+ def finalize
49
+ puts "finalize"
50
+ @terminated = true
51
+ @tuple_space_server_receiver.terminate
52
+ @socket.close
53
+ @updater.terminate
54
+ @tuple_space_servers = []
55
+ end
56
+
57
+ alias :terminate :finalize
58
+
59
+ def terminated?
60
+ @terminated
61
+ end
62
+
63
+ private
64
+
65
+ # Opens receiver socket.
66
+ # @return [UDPSocket]
67
+ # server socket
68
+ def open_socket
69
+ socket = UDPSocket.open
70
+ socket.bind(Socket::INADDR_ANY, Global.presence_port)
71
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
72
+ return socket
73
+ end
74
+
75
+ # Receives tuple space servers and updates the table.
76
+ # @return [void]
77
+ def receive_tuple_space_servers
78
+ data, addr = @socket.recvfrom(1024)
79
+ port = Marshal.load(data)
80
+ ip_address = addr[3]
81
+ provider_front = DRbObject.new_with_uri("druby://%s:%s" % [ip_address, port])
82
+ # need return of ping in short time
83
+ Timeout.timeout(1) do
84
+ provider_front.ping
85
+ provider_front.tuple_space_servers.each do |tuple_space_server|
86
+ @tuple_space_server_lock.synchronize do
87
+ @tuple_space_servers[tuple_space_server] = Time.now
88
+ end
89
+ end
90
+ end
91
+ if Global.show_presence_notifier
92
+ puts "presence notifier was received: %s" % provider_front.__drburi
93
+ end
94
+ rescue DRb::DRbConnError, DRb::ReplyReaderThreadError, IOError => e
95
+ @socket.close
96
+ @socket = open_socket
97
+ if Global.show_presence_notifier
98
+ puts "tuple space receiver disconnected"
99
+ end
100
+ rescue Exception
101
+ # ignore
102
+ end
103
+
104
+ def update_tuple_space_servers
105
+ # update tuple space server list
106
+ @tuple_space_server_lock.synchronize do
107
+ @tuple_space_servers.delete_if do |server, time|
108
+ begin
109
+ # ping
110
+ timeout(1) { server.ping }
111
+ # check timespan
112
+ (Time.now - time) > Global.tuple_space_receiver_disconnect_time
113
+ rescue Exception
114
+ true
115
+ end
116
+ end
117
+ end
118
+
119
+ # update broker
120
+ @broker_lock.synchronize do
121
+ @brokers.select! do |broker|
122
+ begin
123
+ timeout(1) { broker.ping }
124
+ broker.update_tuple_space_servers(tuple_space_servers)
125
+ true
126
+ rescue Exception => e
127
+ puts "[[[dead server]]]"
128
+ ErrorReport.print(e)
129
+ false
130
+ end
131
+ end
132
+ end
133
+
134
+ sleep 1
135
+ rescue Exception
136
+ # ignore
137
+ end
138
+ end
139
+ end
140
+ end