pione 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,294 @@
1
+ module Pione::Model
2
+ # RuleCondition represents rule condition.
3
+ class RuleCondition < BasicModel
4
+ # Returns the value of attribute inputs.
5
+ # @return [Array<DataExpr, Array<DataExpr>>]
6
+ # rule inputs condition
7
+ attr_reader :inputs
8
+
9
+ # Returns the value of attribute outputs.
10
+ # @return [Array<DataExpr, Array<DataExpr>>]
11
+ # rule outputs condition
12
+ attr_reader :outputs
13
+
14
+ # Returns the value of attribute params.
15
+ # @return [Parameters]
16
+ # rule parameters table
17
+ attr_reader :params
18
+
19
+ # Returns the value of attribute features.
20
+ # @return [Feature]
21
+ # rule feature condition
22
+ attr_reader :features
23
+
24
+ # Creates a rule condition.
25
+ # @param [Array<DataExpr, Array<DataExpr>>] inputs
26
+ # rule inputs
27
+ # @param [Array<DataExpr, Array<DataExpr>>] outputs
28
+ # rule outputs
29
+ # @param [Parameters] params
30
+ # rule parameters
31
+ # @param [Feature] features
32
+ # rule features
33
+ def initialize(inputs, outputs, params, features)
34
+ check_argument_type(params, Parameters)
35
+ check_argument_type(features, Feature::Expr)
36
+ @inputs = inputs
37
+ @outputs = outputs
38
+ @params = params
39
+ @features = features
40
+ super()
41
+ end
42
+
43
+ # Returns true if the condition includes variable.
44
+ # @return [Boolean]
45
+ # true if the condition includes variable, or false
46
+ def include_variable?
47
+ [ @inputs.any? {|input| input.include_variable?},
48
+ @outputs.any? {|output| output.include_variable?},
49
+ @params.include_variable?,
50
+ @features.include_variable?
51
+ ].any?
52
+ end
53
+
54
+ # @api private
55
+ def ==(other)
56
+ return false unless @inputs == other.inputs
57
+ return false unless @outputs == other.outputs
58
+ return false unless @params == other.params
59
+ return false unless @features == other.features
60
+ return true
61
+ end
62
+
63
+ alias :eql? :"=="
64
+
65
+ # @api private
66
+ def hash
67
+ @inputs.hash + @outputs.hash + @params.hash + @features.hash
68
+ end
69
+ end
70
+
71
+ # Rule is a class for PIONE rule model.
72
+ class Rule < BasicModel
73
+ extend Forwardable
74
+
75
+ # Returns rule type.
76
+ def self.rule_type
77
+ @rule_type
78
+ end
79
+
80
+ # Returns the value of attribute expr.
81
+ # @return [Array<DataExpr, Array<DataExpr>>]
82
+ # rule inputs condition
83
+ attr_reader :expr
84
+
85
+ attr_reader :condition
86
+ attr_reader :body
87
+
88
+ def_delegators :@condition, :inputs, :outputs, :params, :features
89
+
90
+ # Creates a rule.
91
+ # @param [RuleExpr] expr
92
+ # rule expression
93
+ # @param [RuleCondition] condition
94
+ # rule condition
95
+ # @param [Block] body
96
+ # rule body block
97
+ def initialize(expr, condition, body)
98
+ @expr = expr
99
+ @condition = condition
100
+ @body = body
101
+ end
102
+
103
+ # Returns the rule path.
104
+ # @return [String]
105
+ # rule path
106
+ def rule_path
107
+ @expr.rule_path
108
+ end
109
+
110
+ # Returns true if expression, condition, or body include variables.
111
+ # @return [Boolean]
112
+ # true if expression, condition, or body include variables
113
+ def include_variable?
114
+ return true if @expr.include_variable?
115
+ return true if @condition.include_variable?
116
+ return true if @body.include_variable?
117
+ return false
118
+ end
119
+
120
+ # Returns true if this is a kind of action rule.
121
+ # @return [Boolean]
122
+ # true if this is a kind of action rule, or false
123
+ def action?
124
+ self.class.rule_type == :action
125
+ end
126
+
127
+ # Returns true if this is a kind of flow rule.
128
+ # @return [Boolean]
129
+ # true if this is a kind of flow rule, or false
130
+ def flow?
131
+ self.class.rule_type == :flow
132
+ end
133
+
134
+ # Makes a task handler object for the rule.
135
+ # @param [TupleSpaceServer] ts_server
136
+ # tuple space server
137
+ # @param [Array<Data, Array<Data>>] inputs
138
+ # input tuples
139
+ # @param [Parameters] params
140
+ # rule parameters
141
+ # @param [Array<String>] call_stack
142
+ # call stack
143
+ # @return [RuleHandler]
144
+ # rule handler object
145
+ def make_handler(ts_server, inputs, params, call_stack, opts={})
146
+ handler_class.new(ts_server, self, inputs, params, call_stack, opts)
147
+ end
148
+
149
+ # Returns a rule handler class.
150
+ # @api private
151
+ def handler_class
152
+ raise NotImplementedError
153
+ end
154
+
155
+ # @api private
156
+ def ==(other)
157
+ return false unless other.kind_of?(self.class)
158
+ return false unless @expr == other.expr
159
+ return false unless @condition == other.condition
160
+ return false unless @body == other.body
161
+ return true
162
+ end
163
+
164
+ alias :eql? :"=="
165
+
166
+ # @api private
167
+ def hash
168
+ @expr.hash + @condition.hash + @body.hash
169
+ end
170
+ end
171
+
172
+ # ActionRule is a rule writing action.
173
+ class ActionRule < Rule
174
+ @rule_type = :action
175
+
176
+ # @api private
177
+ def handler_class
178
+ RuleHandler::ActionHandler
179
+ end
180
+ end
181
+
182
+ # FlowRule represents a flow structured rule. This rule is consisted by flow
183
+ # elements and executes elements actions.
184
+ class FlowRule < Rule
185
+ @rule_type = :flow
186
+
187
+ # @api private
188
+ def handler_class
189
+ RuleHandler::FlowHandler
190
+ end
191
+ end
192
+
193
+ # RootRule is a hidden toplevel flow rule like the following:
194
+ # Rule Root
195
+ # input '*'.all
196
+ # output '*'.all.except('{$INPUT[1]}')
197
+ # Flow
198
+ # rule &main:Main
199
+ # End
200
+ class RootRule < FlowRule
201
+ INPUT_DOMAIN = 'input'
202
+
203
+ # root domain has no digest and no package
204
+ ROOT_DOMAIN = 'root'
205
+
206
+ attr_reader :main
207
+
208
+ # Makes a rule.
209
+ def initialize(main, params=Parameters.empty)
210
+ @main = main
211
+ @params = params
212
+ condition = make_condition
213
+ super(
214
+ RuleExpr.new(Package.new("root"), "Root"),
215
+ condition,
216
+ FlowBlock.new(CallRule.new(@main.expr.set_params(@params)))
217
+ )
218
+ @domain = ROOT_DOMAIN
219
+ end
220
+
221
+ # @api private
222
+ def make_handler(ts_server)
223
+ finder = DataFinder.new(ts_server, INPUT_DOMAIN)
224
+ results = finder.find(:input, inputs, @params.as_variable_table)
225
+ if results.empty? and not(@main.inputs.empty?)
226
+ return nil
227
+ end
228
+ inputs = @main.inputs.empty? ? [] : results.first.combination
229
+ handler_class.new(
230
+ ts_server,
231
+ self,
232
+ inputs,
233
+ @params,
234
+ [],
235
+ {:domain => @domain}
236
+ )
237
+ end
238
+
239
+ private
240
+
241
+ # @api private
242
+ def make_condition
243
+ RuleCondition.new(
244
+ @main.inputs,
245
+ @main.outputs,
246
+ Parameters.empty,
247
+ Feature.empty
248
+ )
249
+ end
250
+
251
+ # @api private
252
+ def handler_class
253
+ RuleHandler::RootHandler
254
+ end
255
+ end
256
+
257
+ # SystemRule represents built-in rule definition. System rules belong to
258
+ # 'system' package.
259
+ class SystemRule < ActionRule
260
+ # Creates a system rule model.
261
+ # @param [String] name
262
+ # rule name
263
+ # @param [Proc] b
264
+ # rule process
265
+ def initialize(name, &b)
266
+ expr = RuleExpr.new(Package.new('system'), name)
267
+ condition = make_condition
268
+ super(expr, condition, b)
269
+ end
270
+
271
+ private
272
+
273
+ # @api private
274
+ def make_condition
275
+ inputs = [DataExpr.new('*')]
276
+ RuleCondition.new(inputs, [], Parameters.empty, Feature::EmptyFeature.new)
277
+ end
278
+
279
+ # @api private
280
+ def handler_class
281
+ RuleHandler::SystemHandler
282
+ end
283
+ end
284
+
285
+ # &System:Terminate rule
286
+ SYSTEM_TERMINATE = SystemRule.new('Terminate') do |tuple_space_server|
287
+ user_message "!!!!!!!!!!!!!!!!!"
288
+ user_message "!!! Terminate !!!"
289
+ user_message "!!!!!!!!!!!!!!!!!"
290
+ tuple_space_server.write(Tuple[:command].new("terminate"))
291
+ end
292
+
293
+ SYSTEM_RULES = [ SYSTEM_TERMINATE ]
294
+ end
@@ -0,0 +1,111 @@
1
+ module Pione::Model
2
+ # PioneString is a string value in PIONE system.
3
+ class PioneString < BasicModel
4
+ set_pione_model_type TypeString
5
+ attr_reader :value
6
+
7
+ # Creates a string with the value.
8
+ # @param [String] value
9
+ # string value
10
+ def initialize(value)
11
+ @value = value
12
+ super()
13
+ end
14
+
15
+ # Evaluates the object with the variable table.
16
+ # @param [VariableTable] vtable
17
+ # variable table for evaluation
18
+ # @return [BasicModel]
19
+ # evaluation result
20
+ def eval(vtable)
21
+ self.class.new(vtable.expand(@value))
22
+ end
23
+
24
+ # Returns true if the value includes variables.
25
+ # @return [Boolean]
26
+ # true if the value includes variables
27
+ def include_variable?
28
+ VariableTable.check_include_variable(@value)
29
+ end
30
+
31
+ # @api private
32
+ def task_id_string
33
+ "String<#{@value}>"
34
+ end
35
+
36
+ # @api private
37
+ def textize
38
+ "\"%s\"" % [@value]
39
+ end
40
+
41
+ # Returns ruby's value.
42
+ # @return [String]
43
+ # the value in ruby
44
+ def to_ruby
45
+ return @value
46
+ end
47
+
48
+ # @api private
49
+ def ==(other)
50
+ return false unless other.kind_of?(self.class)
51
+ @value == other.value
52
+ end
53
+
54
+ alias :eql? :"=="
55
+
56
+ # @api private
57
+ def hash
58
+ @value.hash
59
+ end
60
+ end
61
+
62
+ TypeString.instance_eval do
63
+ define_pione_method("==", [TypeString], TypeBoolean) do |rec, other|
64
+ PioneBoolean.new(rec.value == other.value)
65
+ end
66
+
67
+ define_pione_method("!=", [TypeString], TypeBoolean) do |rec, other|
68
+ PioneBoolean.not(rec.call_pione_method("==", other))
69
+ end
70
+
71
+ define_pione_method("+", [TypeString], TypeString) do |rec, other|
72
+ PioneString.new(rec.value + other.value)
73
+ end
74
+
75
+ define_pione_method("as_string", [], TypeString) do |rec|
76
+ rec
77
+ end
78
+
79
+ define_pione_method("as_int", [], TypeInteger) do |rec|
80
+ PioneInteger.new(rec.value.to_i)
81
+ end
82
+
83
+ define_pione_method("as_float", [], TypeFloat) do |rec|
84
+ PioneFloat.new(rec.value.to_f)
85
+ end
86
+
87
+ define_pione_method("length", [], TypeInteger) do |rec|
88
+ PioneInteger.new(rec.value.size)
89
+ end
90
+
91
+ define_pione_method("include?", [TypeString], TypeBoolean) do |rec, str|
92
+ PioneBoolean.new(rec.value.include?(str.value))
93
+ end
94
+
95
+ define_pione_method("substring",
96
+ [TypeInteger, TypeInteger],
97
+ TypeString) do |rec, nth, len|
98
+ PioneString.new(rec.value[nth.value, len.value])
99
+ end
100
+ end
101
+ end
102
+
103
+ # String extention for PIONE system.
104
+ class String
105
+ # Returns PIONE's value.
106
+ # @return [PioneString]
107
+ # PIONE's value
108
+ def to_pione
109
+ PioneString.new(self)
110
+ end
111
+ end
@@ -0,0 +1,24 @@
1
+ module Pione
2
+ module Model
3
+ class UndefinedValue < BasicModel
4
+ set_pione_model_type TypeUndefinedValue
5
+
6
+ def ==(other)
7
+ return other.kind_of?(UndefinedValue)
8
+ end
9
+
10
+ alias :eql? :"=="
11
+
12
+ def hash
13
+ 0
14
+ end
15
+
16
+ #
17
+ # pione model method
18
+ #
19
+ define_pione_method("as_string", [], TypeString) do |rec|
20
+ PioneString.new("undefined")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,315 @@
1
+ module Pione::Model
2
+ # UnboundVariableError represents an unknown variable reference.
3
+ class UnboundVariableError < StandardError
4
+ attr_reader :variable
5
+
6
+ # Creates an error.
7
+ # @param [Variable] variable
8
+ # unbound variable
9
+ def initialize(variable)
10
+ @variable = variable
11
+ end
12
+
13
+ # @api private
14
+ def message
15
+ "Refferred unbound variable '%s' in the context." % @variable.name
16
+ end
17
+ end
18
+
19
+ # VariableBindingError represents an error that you try to bind different value
20
+ # to a variable.
21
+ class VariableBindingError < StandardError
22
+ attr_reader :variable
23
+ attr_reader :new_value
24
+ attr_reader :old_value
25
+
26
+ # Creates an error.
27
+ # @param [Variable] variable
28
+ # double bound variable
29
+ # @param [BasicModel] new_value
30
+ # new value
31
+ # @param [BasicModel] old_value
32
+ # old value
33
+ def initialize(variable, new_value, old_value)
34
+ @variable = variable
35
+ @new_value = new_value
36
+ @old_value = old_value
37
+ end
38
+
39
+ # @api private
40
+ def message
41
+ args = [
42
+ @new_value.textize,
43
+ @variable.name,
44
+ @old_value.textize,
45
+ @variable.line,
46
+ @variable.column
47
+ ]
48
+ message = [
49
+ "Try to bind the value '%s' as variable %s, ",
50
+ "but already bound the value '%s'",
51
+ "(line: %s, column: %s)"
52
+ ] % args
53
+ end
54
+ end
55
+
56
+ # VariableTable represents variable tables for rule context.
57
+ class VariableTable < BasicModel
58
+ set_pione_model_type TypeVariableTable
59
+
60
+ # Returns empty variable table.
61
+ # @return [VariableTable]
62
+ # empty variable table
63
+ def self.empty
64
+ new
65
+ end
66
+
67
+ # Creates a vairable table.
68
+ # @param [Hash{Variable => BasicModel}] table
69
+ # initial values for the variable table
70
+ def initialize(table={})
71
+ @table = table.to_hash.dup
72
+ super()
73
+ end
74
+
75
+ # Returns the variable table as hash.
76
+ # @return [Hash{Variable => BasicModel}]
77
+ # hash form of the variable table
78
+ def to_hash
79
+ @table
80
+ end
81
+
82
+ # Returns the parameters form.
83
+ # @return [Parameters]
84
+ # parameters form of the variable table
85
+ def to_params
86
+ Parameters.new(to_hash)
87
+ end
88
+
89
+ # Returns true if the table is empty.
90
+ # @return [Boolean]
91
+ # true if the table is empty
92
+ def empty?
93
+ @table.empty?
94
+ end
95
+
96
+ # Gets the variable value and evaluates the value if the value is not
97
+ # atomic.
98
+ # @param [Variable] var
99
+ # table key to get the value
100
+ # @return [BasicModel]
101
+ # the value
102
+ def get(var)
103
+ check_argument_type(var, Variable)
104
+ val = @table[var]
105
+ case val
106
+ when Variable
107
+ next_val = get(val)
108
+ return next_val.nil? ? val : next_val
109
+ when BasicModel
110
+ return not(val.atomic?) ? val.eval(self) : val
111
+ end
112
+ return val
113
+ end
114
+
115
+ # Sets a new variable. This method raises an exception when the variable has
116
+ # its value already.
117
+ # @param [Variable] variable
118
+ # table key
119
+ # @param [BasicModel] new_value
120
+ # new value
121
+ # @return [VariableTable]
122
+ # new variable table
123
+ def set(variable, new_value)
124
+ check_argument_type(variable, Variable)
125
+ check_argument_type(new_value, BasicModel)
126
+ if old_value = @table[variable]
127
+ unless old_value.kind_of?(UndefinedValue) or new_value == old_value
128
+ raise VariableBindingError.new(variable, new_value, old_value)
129
+ end
130
+ end
131
+ @table[variable] = new_value
132
+ end
133
+
134
+ # Sets a variable. This method overrides old variable value.
135
+ # @param [Variable] variable
136
+ # table key
137
+ # @param [BasicModel] new_value
138
+ # new value
139
+ # @return [void]
140
+ def set!(variable, new_value)
141
+ check_argument_type(variable, Variable)
142
+ check_argument_type(new_value, BasicModel)
143
+ @table[variable] = new_value
144
+ end
145
+
146
+ # Expands variables in the string.
147
+ # @param [String] str
148
+ # string
149
+ # @return [String]
150
+ # expanded string
151
+ def expand(str)
152
+ variables = to_hash
153
+ new_str = str.to_s.gsub(/\{(\$.+?)\}/) do
154
+ expr = DocumentTransformer.new.apply(DocumentParser.new.expr.parse($1))
155
+ expr.eval(self).call_pione_method("as_string").to_ruby
156
+ end
157
+ new_str.gsub(/\<\?\s*(.+?)\s*\?\>/) do
158
+ expr = DocumentTransformer.new.apply(DocumentParser.new.expr.parse($1))
159
+ expr.eval(self).call_pione_method("as_string").to_ruby
160
+ end
161
+ end
162
+
163
+ # Returns key variables of the table.
164
+ # @return [Array<Variable>]
165
+ # variable as table keys
166
+ def variables
167
+ @table.keys
168
+ end
169
+
170
+ # FIXME
171
+ # Returns true if the string includes variables.
172
+ # @param [String] str
173
+ # target string
174
+ # @return [Boolean]
175
+ # true if the string includes variables
176
+ def self.check_include_variable(str)
177
+ str = str.to_s
178
+ return true if /\{\$(.+?)\}/.match(str)
179
+ str.gsub(/\<\?\s*(.+?)\s*\?\>/) do
180
+ expr = Transformer.new.apply(Parser.new.expr.parse($1))
181
+ return true if expr.include_variable?
182
+ end
183
+ return false
184
+ end
185
+
186
+ # Returns true if table's values include variables.
187
+ # @return [Boolean]
188
+ # true if table's values include variables
189
+ def include_variable?
190
+ # FIXME
191
+ @table.values.any?{|val| val.include_variable?}
192
+ end
193
+
194
+ # Makes input auto-variables.
195
+ # @param [Array<DataExpr>] input_exprs
196
+ # input expressions
197
+ # @param [Array<Expr>] input_tuples
198
+ # input tuples
199
+ # @return [void]
200
+ def make_input_auto_variables(input_exprs, input_tuples)
201
+ set(Variable.new("INPUT"), Variable.new("I"))
202
+ input_exprs.each_with_index do |expr, index|
203
+ make_io_auto_variables(:input, expr, input_tuples[index], index+1)
204
+ end
205
+ end
206
+
207
+ # Makes output auto-variables.
208
+ # @param [Array<DataExpr>] output_exprs
209
+ # output expressions
210
+ # @param [Array<DataExpr>] output_tuples
211
+ # output tuples
212
+ # @return [void]
213
+ def make_output_auto_variables(output_exprs, output_tuples)
214
+ set(Variable.new("OUTPUT"), Variable.new("O"))
215
+ output_exprs.each_with_index do |expr, index|
216
+ make_io_auto_variables(:output, expr, output_tuples[index], index+1)
217
+ end
218
+ end
219
+
220
+ # @api private
221
+ def ==(other)
222
+ return false unless other.kind_of?(self.class)
223
+ @table == other.to_hash
224
+ end
225
+
226
+ alias :eql? :"=="
227
+
228
+ # @api private
229
+ def hash
230
+ @table.hash
231
+ end
232
+
233
+ private
234
+
235
+ # Make input or output auto variables.
236
+ # @api private
237
+ def make_io_auto_variables(type, expr, data, index)
238
+ expr = expr.eval(self)
239
+ prefix = (type == :input ? "I" : "O")
240
+ case expr.modifier
241
+ when :all
242
+ make_io_auto_variables_by_all(type, prefix, expr, data)
243
+ when :each
244
+ make_io_auto_variables_by_each(prefix, expr, data, index)
245
+ end
246
+ end
247
+
248
+ # Make input or output auto variables for 'exist' modified data name
249
+ # expression.
250
+ # @api private
251
+ def make_io_auto_variables_by_each(prefix, expr, tuple, index)
252
+ return if tuple.nil?
253
+ # variable
254
+ var = Variable.new(prefix)
255
+ # matched data
256
+ md = expr.match(tuple.name).to_a
257
+
258
+ # setup rule-io list
259
+ list = get(var)
260
+ list = RuleIOList.new unless list
261
+ elt = RuleIOElement.new(PioneString.new(tuple.name))
262
+ elt.uri = PioneString.new(tuple.uri)
263
+ elt.match = PioneList.new(*md.map{|d| PioneString.new(d)})
264
+
265
+ # update the list
266
+ set!(var, list.add(elt))
267
+
268
+ # set special variable if index equals 1
269
+ if prefix == 'I' && index == 1
270
+ set(Variable.new("*"), PioneString.new(md[1]))
271
+ end
272
+ end
273
+
274
+ # Make input or output auto variables for 'all' modified data name
275
+ # expression.
276
+ # @api private
277
+ def make_io_auto_variables_by_all(type, prefix, expr, tuples)
278
+ # FIXME: output
279
+ return if type == :output
280
+
281
+ # variable
282
+ var = Variable.new(prefix)
283
+
284
+ # setup rule-io list
285
+ list = get(var)
286
+ list = RuleIOList.new unless list
287
+ io_list = RuleIOList.new()
288
+
289
+ # convert each tuples
290
+ tuples.each do |tuple, i|
291
+ elt = RuleIOElement.new(PioneString.new(tuple.name))
292
+ elt.uri = PioneString.new(tuple.uri)
293
+ elt.match = PioneList.new(
294
+ *expr.match(tuple.name).to_a.map{|m| PioneString.new(m)}
295
+ )
296
+ io_list.add!(elt)
297
+ end
298
+
299
+ # update
300
+ set!(var, list.add(io_list))
301
+ end
302
+
303
+ #
304
+ # pione methods
305
+ #
306
+
307
+ define_pione_method("get", [TypeString], TypeAny) do |name|
308
+ get(Variable.new(name.value))
309
+ end
310
+
311
+ define_pione_method("keys", [], TypeList.new(TypeString)) do
312
+ PioneList.new(@table.keys.map{|var| PioneString.new(var.name)})
313
+ end
314
+ end
315
+ end