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,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