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,233 @@
1
+ module Pione::Model
2
+ # ActionBlock represents content script of action.
3
+ # @example
4
+ # Action
5
+ # echo "abc"
6
+ # End
7
+ # #=> ActionBlock.new(" echo \"abc\"")
8
+ class ActionBlock < BasicModel
9
+ attr_reader :content
10
+
11
+ # Creates a action block.
12
+ # @param [String] content
13
+ # action content of shell script
14
+ def initialize(content)
15
+ @content = content
16
+ super()
17
+ end
18
+
19
+ # Evaluates the object.
20
+ # @param [VariableTable] vtable
21
+ # variable table for evaluation
22
+ # @return [BasicModel]
23
+ # evaluation result
24
+ def eval(vtable)
25
+ self.class.new(vtable.expand(@content))
26
+ end
27
+
28
+ # Returns true if the content includes variables.
29
+ # @return [Boolean]
30
+ # true if the content includes variables
31
+ def include_variable?
32
+ return VariableTable.check_include_variable(@content)
33
+ end
34
+
35
+ # @api private
36
+ def textize
37
+ "action_block(\"#{@content}\")"
38
+ end
39
+
40
+ # @api private
41
+ def ==(other)
42
+ return false unless other.kind_of?(self.class)
43
+ @content == other.content
44
+ end
45
+
46
+ alias :eql? :==
47
+
48
+ # @api private
49
+ def hash
50
+ @content.hash
51
+ end
52
+ end
53
+
54
+ # FlowBlock represents flow element sequence.
55
+ # @example
56
+ # Flow
57
+ # rule Test1
58
+ # rule Test2
59
+ # rule Test3
60
+ # End
61
+ # #=> Block.new([ CallRule.new('Test1'),
62
+ # CallRule.new('Test2'),
63
+ # CallRule.new('Test3') ])
64
+ class FlowBlock < BasicModel
65
+ attr_reader :elements
66
+
67
+ # Create a flow block.
68
+ # @param [Array<BasicModel>] elements
69
+ # flow elements
70
+ def initialize(*elements)
71
+ unless elements.all? {|elt| elt.kind_of?(BasicModel)}
72
+ raise ArgumentError.new(elements)
73
+ end
74
+ @elements = elements
75
+ end
76
+
77
+ # Evaluates each elements and return it.
78
+ # @param [VariableTable] vtable
79
+ # variable table for evaluation
80
+ # @return [BasicModel]
81
+ # evaluation result
82
+ def eval(vtable)
83
+ assignments = @elements.select{|elt| elt.kind_of?(Assignment)}
84
+ conditional_blocks = @elements.select{|elt| elt.kind_of?(ConditionalBlock)}
85
+ call_rules = @elements.select{|elt| elt.kind_of?(CallRule)}
86
+
87
+ if not(assignments.empty?)
88
+ assignments.each do |assignment|
89
+ assignment.eval(vtable)
90
+ end
91
+ FlowBlock.new(*(conditional_blocks+call_rules)).eval(vtable)
92
+ elsif not(conditional_blocks.empty?)
93
+ exception = nil
94
+ new_blocks = []
95
+ next_blocks = []
96
+ conditional_blocks.each do |block|
97
+ begin
98
+ new_blocks << block.eval(vtable)
99
+ rescue UnboundVariableError => e
100
+ exception = e
101
+ next_blocks << block
102
+ end
103
+ end
104
+ # fail to evaluate conditional blocks
105
+ if conditional_blocks == next_blocks
106
+ raise exception
107
+ end
108
+ # next
109
+ elements = new_blocks.inject([]){|elts, block| elts += block.elements}
110
+ FlowBlock.new(*(elements + next_blocks + call_rules)).eval(vtable)
111
+ else
112
+ FlowBlock.new(*call_rules.map{|call_rule| call_rule.eval(vtable)})
113
+ end
114
+ end
115
+
116
+ # Returns true if the elements include variables.
117
+ # @return [Boolean]
118
+ # true if the elements include variables
119
+ def include_variable?
120
+ @elements.any?{|elt| elt.include_variable?}
121
+ end
122
+
123
+ # @api private
124
+ def textize
125
+ "flow_block(%s)" % [@elements.map{|elt| elt.textize}.join(",")]
126
+ end
127
+
128
+ # @api private
129
+ def ==(other)
130
+ return false unless other.kind_of?(self.class)
131
+ @elements == other.elements
132
+ end
133
+
134
+ alias :eql? :==
135
+
136
+ # @api private
137
+ def hash
138
+ @elements.hash
139
+ end
140
+ end
141
+
142
+ # ConditionalBlock represents conditional flow applications.
143
+ # @example
144
+ # # if statement
145
+ # if $X == "a"
146
+ # rule Test1
147
+ # else
148
+ # rule Test2
149
+ # end
150
+ # #=> ConditionalBlock.new(
151
+ # BinaryOperator::Equals.new(Variable.new('X'), 'a'),
152
+ # { true => [CallRule.new('Test1')],
153
+ # :else => [CallRule.new('Test2')] })
154
+ # @example
155
+ # # case statement
156
+ # case $X
157
+ # when "a"
158
+ # rule Test1
159
+ # when "b"
160
+ # rule Test2
161
+ # else
162
+ # rule Test3
163
+ # end
164
+ # # => ConditionalBlock.new(
165
+ # Variable.new('X'),
166
+ # { 'a' => FlowBlock.new(CallRule.new('Test1')),
167
+ # 'b' => FlowBlock.new(CallRule.new('Test2')),
168
+ # :else => FlowBlock.new(CallRule.new('Test3')) })
169
+ class ConditionalBlock < BasicModel
170
+ attr_reader :condition
171
+ attr_reader :blocks
172
+
173
+ # Creates a conditional block.
174
+ # @param [BasicModel] condition
175
+ # condition value
176
+ # @param [Hash{BasicModel => FlowBlock}] blocks
177
+ # condition key and block
178
+ def initialize(condition, blocks={})
179
+ unless blocks.all?{|key,val|
180
+ (key.kind_of?(BasicModel) or key == :else) &&
181
+ val.kind_of?(FlowBlock)
182
+ }
183
+ raise ArgumentError.new(blocks)
184
+ end
185
+ @condition = condition
186
+ @blocks = blocks
187
+ end
188
+
189
+ # Evaluates the condition and returns the flow block.
190
+ # @param [VariableTable] vtable
191
+ # variable table for evaluation
192
+ # @return [BasicModel]
193
+ # evaluation result
194
+ def eval(vtable)
195
+ value = @condition.eval(vtable)
196
+ if block = @blocks.find {|key, _| key == value}
197
+ return block[1].eval(vtable)
198
+ elsif block = @blocks[:else]
199
+ return block.eval(vtable)
200
+ else
201
+ return FlowBlock.new
202
+ end
203
+ end
204
+
205
+ # Returns ture if blocks include variables.
206
+ # @return [Boolean]
207
+ # ture if blocks include variables
208
+ def include_variable?
209
+ @blocks.values.any?{|block| block.include_variable?}
210
+ end
211
+
212
+ # @api private
213
+ def textize
214
+ "conditional_block(%s,{%s})" % [
215
+ @condition.textize,
216
+ @blocks.map{|val, block| "%s=>%s" % [val,block]}.join(",")
217
+ ]
218
+ end
219
+
220
+ # @api private
221
+ def ==(other)
222
+ return false unless other.kind_of?(self.class)
223
+ @condition == other.condition && @blocks == other.blocks
224
+ end
225
+
226
+ alias :eql? :==
227
+
228
+ # @api private
229
+ def hash
230
+ @condition.hash + @blocks.hash
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,138 @@
1
+ module Pione::Model
2
+ # PioneBoolean representes truth value in PIONE system.
3
+ class PioneBoolean < BasicModel
4
+ set_pione_model_type TypeBoolean
5
+
6
+ # Returns the value in ruby.
7
+ attr_reader :value
8
+
9
+ class << self
10
+ # Returns true value in PIONE system.
11
+ # @return [PioneBoolean]
12
+ # true value
13
+ def true
14
+ new(true)
15
+ end
16
+
17
+ # Returns false value in PIONE system.
18
+ # @return [PioneBoolean]
19
+ # false value
20
+ def false
21
+ new(false)
22
+ end
23
+
24
+ # Returns inverse value of it.
25
+ # @param [Boolean] boolean
26
+ # target value
27
+ # @return [PioneBoolean]
28
+ # true if the param is false, or false
29
+ def not(boolean)
30
+ new(not(boolean.value))
31
+ end
32
+
33
+ # Returns true value if arguments include true value.
34
+ # @param [Array<PioneBoolean>] args
35
+ # @return [PioneBoolean]
36
+ # true value if arguments include true value
37
+ def or(*args)
38
+ new(args.any?{|arg| arg.true?})
39
+ end
40
+
41
+ # Returns true value if all arguments has true value.
42
+ # @param [Array<PioneBoolean>] args
43
+ # @return [PioneBoolean]
44
+ # true value if all arguments has true value
45
+ def and(*args)
46
+ new(args.all?{|arg| arg.true?})
47
+ end
48
+ end
49
+
50
+ # Creates a value.
51
+ # @param [Boolean] value
52
+ # true or false
53
+ def initialize(value)
54
+ @value = value
55
+ super()
56
+ end
57
+
58
+ # @api private
59
+ def task_id_string
60
+ "Boolean<#{@value}>"
61
+ end
62
+
63
+ # @api private
64
+ def textize
65
+ @value.to_s
66
+ end
67
+
68
+ # Returns true if the value is true.
69
+ # @return [Boolean]
70
+ # true if the value is true
71
+ def true?
72
+ @value == true
73
+ end
74
+
75
+ # Returns true if the value is false.
76
+ # @return [Boolean]
77
+ # true if the value is false
78
+ def false?
79
+ @value == false
80
+ end
81
+
82
+ # Returns ruby's boolean value.
83
+ # @return [Boolean]
84
+ # ruby's boolean value
85
+ def to_ruby
86
+ return @value
87
+ end
88
+
89
+ # @api private
90
+ def ==(other)
91
+ return false unless other.kind_of?(self.class)
92
+ @value == other.value
93
+ end
94
+
95
+ alias :eql? :==
96
+
97
+ # @api private
98
+ def hash
99
+ @value.hash
100
+ end
101
+
102
+ #
103
+ # pione methods
104
+ #
105
+
106
+ define_pione_method("==", [TypeBoolean], TypeBoolean) do |rec, other|
107
+ PioneBoolean.new(rec.value == other.value)
108
+ end
109
+
110
+ define_pione_method("!=", [TypeBoolean], TypeBoolean) do |rec, other|
111
+ PioneBoolean.not(rec.call_pione_method("==", other))
112
+ end
113
+
114
+ define_pione_method("&&", [TypeBoolean], TypeBoolean) do |rec, other|
115
+ PioneBoolean.new(rec.value && other.value)
116
+ end
117
+
118
+ define_pione_method("||", [TypeBoolean], TypeBoolean) do |rec, other|
119
+ PioneBoolean.new(rec.value || other.value)
120
+ end
121
+
122
+ define_pione_method("and", [TypeBoolean], TypeBoolean) do |rec, other|
123
+ rec.call_pione_method("&&", other)
124
+ end
125
+
126
+ define_pione_method("or", [TypeBoolean], TypeBoolean) do |rec, other|
127
+ rec.call_pione_method("||", other)
128
+ end
129
+
130
+ define_pione_method("as_string", [], TypeString) do |rec|
131
+ PioneString.new(rec.value.to_s)
132
+ end
133
+
134
+ define_pione_method("not", [], TypeBoolean) do |rec|
135
+ PioneBoolean.not(rec)
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,69 @@
1
+ module Pione::Model
2
+ # CallRule represents the application of a rule.
3
+ # @example
4
+ # # simple rule calling:
5
+ # rule r1
6
+ # #=> CallRule.new(RuleExpr.new('r1'))
7
+ # @example
8
+ # # with absolute path:
9
+ # rule /abc:a
10
+ # #=> CallRule.new(RuleExpr.new('/abc:a'))
11
+ # @example
12
+ # # with variable:
13
+ # rule $X
14
+ # #=> CallRule.new(Variable.new('X'))
15
+ class CallRule < BasicModel
16
+ attr_reader :expr
17
+
18
+ # Creates a callee rule.
19
+ # @param [BasicModel] expr
20
+ # callee rule
21
+ def initialize(expr)
22
+ @expr = expr
23
+ super()
24
+ end
25
+
26
+ # Returns a rule path string with expanding variables.
27
+ # @return [String]
28
+ # rule path(package name and rule name)
29
+ def rule_path
30
+ if @expr.include_variable?
31
+ raise UnboundVariableError.new(@expr)
32
+ end
33
+ @expr.rule_path
34
+ end
35
+
36
+ # Returns true if the expression has variables.
37
+ # @return [Boolean]
38
+ # true if the expression has variables
39
+ def include_variable?
40
+ @expr.include_variable?
41
+ end
42
+
43
+ # Evaluates the expression.
44
+ # @param [VariableTable] vtable
45
+ # variable table for evaluation
46
+ # @return [BasicModel]
47
+ # evaluation result
48
+ def eval(vtable)
49
+ self.class.new(@expr.eval(vtable))
50
+ end
51
+
52
+ # @api private
53
+ def textize
54
+ "call_rule(%s)" % [@expr.textize]
55
+ end
56
+
57
+ # @api private
58
+ def ==(other)
59
+ @expr == other.expr
60
+ end
61
+
62
+ alias :eql? :==
63
+
64
+ # @api private
65
+ def hash
66
+ @expr.hash
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,360 @@
1
+ module Pione::Model
2
+
3
+ # DataExpr is a class for data name expressions of rule input and output.
4
+ # @example
5
+ # # complete name
6
+ # DataExpr.new("test.txt")
7
+ # @example
8
+ # # incomplete name
9
+ # DataExpr.new("*.txt")
10
+ class DataExpr < BasicModel
11
+
12
+ # separator symbol for all modifier
13
+ SEPARATOR = ':'
14
+
15
+ # DataExpr::Compiler is a regexp compiler for data expression.
16
+ module Compiler
17
+ TABLE = {}
18
+
19
+ # Define a string matcher.
20
+ def self.define_matcher(matcher, replace)
21
+ TABLE[Regexp.escape(matcher)] = replace
22
+ end
23
+
24
+ # Asterisk symbol is multi-characters matcher(empty string is matched).
25
+ define_matcher('*', '(.*)')
26
+
27
+ # Question symbol is single character matcher(empty string is not matched).
28
+ define_matcher('?', '(.)')
29
+
30
+ # Compiles data name into regular expression.
31
+ def compile(name)
32
+ return name unless name.kind_of?(String)
33
+
34
+ s = "^#{Regexp.escape(name)}$"
35
+ TABLE.keys.each {|key| s.gsub!(key, TABLE)}
36
+ s.gsub!(/\\\[(!|\\\^)?(.*)\\\]/){"[#{'^' if $1}#{$2.gsub('\-','-')}]"}
37
+ s.gsub!(/\\{(.*)\\}/){"(#{$1.split(',').join('|')})"}
38
+ Regexp.new(s)
39
+ end
40
+ module_function :compile
41
+ end
42
+
43
+ # This module implements DataExpr singleton methods.
44
+ module SingletonMethod
45
+ # Create a named expression.
46
+ # @param [String] name
47
+ # data expression
48
+ def [](name)
49
+ new(name)
50
+ end
51
+
52
+ # Create a name expression with 'each' modifier.
53
+ def each(name)
54
+ new(name, :each)
55
+ end
56
+
57
+ # Create a name expression with 'all' modifier.
58
+ def all(name)
59
+ new(name, :all)
60
+ end
61
+
62
+ # Creates a new data name for stdout ouput.
63
+ # @param [String] name
64
+ # data name
65
+ # @return [DataExpr]
66
+ # data expression for stdout
67
+ def stdout(name)
68
+ new(name, :each, :stdout)
69
+ end
70
+
71
+ # Creates a new data name for stderr output.
72
+ # @param [String] name
73
+ # data name
74
+ # @return [DataExpr]
75
+ # data expression for stderr
76
+ def stderr(name)
77
+ new(name, :each, :stderr)
78
+ end
79
+
80
+ # Returns convertion prcedure for enumerable.
81
+ # @return [Proc]
82
+ # +Proc+ object that returns data expression with name
83
+ def to_proc
84
+ Proc.new{|name| name.kind_of?(self) ? name : self.new(name)}
85
+ end
86
+ end
87
+
88
+ extend SingletonMethod
89
+
90
+ set_pione_model_type TypeDataExpr
91
+
92
+ attr_reader :name
93
+ attr_reader :modifier
94
+ attr_reader :mode
95
+ attr_reader :exceptions
96
+
97
+ # Creates a data expression.
98
+ # @param [String] name
99
+ # data expression name
100
+ # @param [Symbol] modifier
101
+ # :all or :each
102
+ # @param [Symbol] mode
103
+ # nil, :stdout, or :stderr
104
+ def initialize(name, modifier = :each, mode = nil, exceptions = [])
105
+ unless name.kind_of? String or name.kind_of? Regexp
106
+ raise ArgumentError.new(name)
107
+ end
108
+
109
+ @name = name
110
+ @modifier = modifier
111
+ @mode = mode
112
+ @exceptions = exceptions
113
+
114
+ super()
115
+ end
116
+
117
+ # Returns new data expression with each modifier.
118
+ # @return [DataExpr]
119
+ # new data expression with each modifier
120
+ def each
121
+ return self.class.new(@name, :each, @mode, @exceptions)
122
+ end
123
+
124
+ # Returns new data expression with all modifier.
125
+ # @return [DataExpr]
126
+ # new data expression with all modifier
127
+ def all
128
+ return self.class.new(@name, :all, @mode, @exceptions)
129
+ end
130
+
131
+ # Returns new data expression with stdout mode.
132
+ # @return [DataExpr]
133
+ # new data expression with stdout mode
134
+ def stdout
135
+ return self.class.new(@name, @modifier, :stdout, @exceptions)
136
+ end
137
+
138
+ # Returns new data expression with stderr mode.
139
+ # @return [DataExpr]
140
+ # new data expression with stderr mode
141
+ def stderr
142
+ return self.class.new(@name, @modifier, :stderr, @exceptions)
143
+ end
144
+
145
+ # Evaluates the data expression.
146
+ # @param [VariableTable] vtable
147
+ # variable table for evaluation
148
+ # @return [BasicModel]
149
+ # evaluation result
150
+ def eval(vtable)
151
+ exceptions = @exceptions.map {|exc| exc.eval(vtable)}
152
+ self.class.new(vtable.expand(name), @modifier, @mode, exceptions)
153
+ end
154
+
155
+ # Returns true if the name includes variables.
156
+ # @return [Boolean]
157
+ # true if the name includes variables
158
+ def include_variable?
159
+ VariableTable.check_include_variable(@name)
160
+ end
161
+
162
+ # @api private
163
+ def task_id_string
164
+ "DataExpr<#{@name},#{@modifier},[%s]>" % [
165
+ @exceptions.map{|exc| exc.task_id_string}.join(",")
166
+ ]
167
+ end
168
+
169
+ # @api private
170
+ def textize
171
+ "data_expr(\"#{@name}\",:#{@modifier},[%s])" % [
172
+ @exceptions.map{|exc| exc.textize}.join(",")
173
+ ]
174
+ end
175
+
176
+ # Return true if the name has 'all' modifier.
177
+ # @return [Boolean]
178
+ # true if the name has 'all' modifier
179
+ def all?
180
+ @modifier == :all
181
+ end
182
+
183
+ # Return true if the name has 'each' modifier.
184
+ # @return [Boolean]
185
+ # true if the name has 'each' modifier
186
+ def each?
187
+ @modifier == :each
188
+ end
189
+
190
+ # Return true if the data content is in stdout.
191
+ # @return [Boolean]
192
+ # true if the data content is in stdout
193
+ def stdout?
194
+ @mode == :stdout
195
+ end
196
+
197
+ # Returns true if the data content is in stderr.
198
+ # @return [Boolean]
199
+ # true if the data content is in stderr
200
+ def stderr?
201
+ @mode == :stderr
202
+ end
203
+
204
+ # Creates new data expression with a exception name.
205
+ # @param [DataExpr, String] name
206
+ # data name for exceptions
207
+ # @return [DataExpr]
208
+ # new data name with the exception
209
+ def except(name)
210
+ exceptions =
211
+ @exceptions.clone + [name.kind_of?(DataExpr) ? name : DataExpr.new(name)]
212
+ return self.class.new(@name, @modifier, @mode, exceptions)
213
+ end
214
+
215
+ # Returns matched data if the name is matched with the expression.
216
+ # @param [String] other
217
+ # data name string
218
+ def match(other)
219
+ # check exceptions
220
+ return false if match_exceptions(other)
221
+ # match test
222
+ md = nil
223
+ @name.split(SEPARATOR).each do |name|
224
+ break if md = compile_to_regexp(name).match(other)
225
+ end
226
+ return md
227
+ end
228
+
229
+ # Selects from name list matched with the expression.
230
+ # @param [Array<String>] names
231
+ # name list
232
+ def select(*names)
233
+ names.flatten.select {|name| match(name) }
234
+ end
235
+
236
+ # Generates concrete name string by arguments.
237
+ # @example
238
+ # DataExpr["test-*.rb"].generate(1)
239
+ # # => "test-1.rb"
240
+ def generate(*args)
241
+ name = @name.clone
242
+ while name =~ /(\*|\?)/ and not(args.empty?)
243
+ val = args.shift.to_s
244
+ name.sub!(/(\*|\?)/){$1 == "*" ? val : val[0]}
245
+ end
246
+ return name
247
+ end
248
+
249
+ # Create OR relation data expression. Self and the other element have the
250
+ # same attributes.
251
+ # @example
252
+ # expr = DataExpr.new("A") | DataExpr.new("B")
253
+ # expr.match("A") # => true
254
+ # expr.match("B") # => true
255
+ # expr.match("C") # => false
256
+ # @example
257
+ # DataExpr.all("A") | DataExpr.each("B")
258
+ # # => raise ArgumentError
259
+ def |(other)
260
+ raise ArgumentError.new(other) unless other.kind_of?(DataExpr)
261
+ return DataExprOr.new(self, other)
262
+ end
263
+
264
+ # @api private
265
+ def to_s
266
+ "#<#<#{self.class.name}> #{@name}>"
267
+ end
268
+
269
+ # Returns true if name, modifier, mode, and exceptions are the same.
270
+ # @api private
271
+ def ==(other)
272
+ return false unless other.kind_of?(self.class)
273
+ return false unless @name == other.name
274
+ return false unless @modifier == other.modifier
275
+ return false unless @mode == other.mode
276
+ return false unless @exceptions.sort == other.exceptions.sort
277
+ return true
278
+ end
279
+
280
+ alias eql? ==
281
+
282
+ # @api private
283
+ def hash
284
+ [@name, @modifier, @mode, @exceptions].join("\000").hash
285
+ end
286
+
287
+ # Same as Regexp#=~ but return 0 if it matched.
288
+ def =~(other)
289
+ match(other) ? 0 : nil
290
+ end
291
+
292
+ # Pattern match.
293
+ # @api private
294
+ def ===(other)
295
+ match(other) ? true : false
296
+ end
297
+
298
+ private
299
+
300
+ # @api private
301
+ def compile_to_regexp(name)
302
+ Compiler.compile(name)
303
+ end
304
+
305
+ # Returns true if the name matchs exceptions.
306
+ # @api private
307
+ def match_exceptions(name)
308
+ not(@exceptions.select{|ex| ex.match(name)}.empty?)
309
+ end
310
+ end
311
+
312
+ # DataExprOr represents or-relation of data expressions.
313
+ class DataExprOr < DataExpr
314
+ extend Forwardable
315
+ def_delegator :@left, :modifier
316
+ def_delegator :@left, :mode
317
+
318
+ def initialize(left, right)
319
+ raise ArgumentError.new([left, right]) unless left.modifier == right.modifier
320
+ raise ArmguentError.new([left, right]) unless left.mode == right.mode
321
+ @left = left
322
+ @right = right
323
+ end
324
+
325
+ # @api private
326
+ def match(name)
327
+ @left.match(name) or @right.match(name)
328
+ end
329
+ end
330
+
331
+ TypeDataExpr.instance_eval do
332
+ define_pione_method("==", [TypeDataExpr], TypeBoolean) do |rec, other|
333
+ PioneBoolean.new(rec == other)
334
+ end
335
+
336
+ define_pione_method("!=", [TypeDataExpr], TypeBoolean) do |rec, other|
337
+ PioneBoolean.not(rec.call_pione_method("==", other))
338
+ end
339
+
340
+ define_pione_method("all", [], TypeDataExpr) do |rec|
341
+ rec.all
342
+ end
343
+
344
+ define_pione_method("each", [], TypeDataExpr) do |rec|
345
+ rec.each
346
+ end
347
+
348
+ define_pione_method("except", [TypeDataExpr], TypeDataExpr) do |rec, target|
349
+ rec.except(target)
350
+ end
351
+
352
+ define_pione_method("stdout", [], TypeDataExpr) do |rec|
353
+ rec.stdout
354
+ end
355
+
356
+ define_pione_method("stderr", [], TypeDataExpr) do |rec|
357
+ rec.stderr
358
+ end
359
+ end
360
+ end