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.
- data/.gitignore +14 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +94 -0
- data/Rakefile +118 -0
- data/bin/pione-broker +5 -0
- data/bin/pione-clean +5 -0
- data/bin/pione-client +5 -0
- data/bin/pione-eval +111 -0
- data/bin/pione-relay +5 -0
- data/bin/pione-relay-account-db +5 -0
- data/bin/pione-relay-client-db +5 -0
- data/bin/pione-search-log +30 -0
- data/bin/pione-syntax-checker +5 -0
- data/bin/pione-task-worker +5 -0
- data/bin/pione-tuple-space-provider +5 -0
- data/bin/pione-tuple-space-receiver +5 -0
- data/bin/pione-tuple-space-viewer +5 -0
- data/demo/demo.rb +311 -0
- data/demo/public/base.css +94 -0
- data/demo/public/demo.js +107 -0
- data/demo/public/index.html +91 -0
- data/demo/public/jquery-1.8.3.min.js +2 -0
- data/example/CountChar/CountChar.pione +64 -0
- data/example/CountChar/misc/CountChar.rb +22 -0
- data/example/CountChar/text/aidokushono_insho.txt +32 -0
- data/example/CountChar/text/aikokuka_shokan.txt +108 -0
- data/example/CountChar/text/carlyle_hakubutsukan.txt +58 -0
- data/example/CountChar/text/dark_minister.txt +2440 -0
- data/example/CountChar/text/kaikano_otto.txt +61 -0
- data/example/CountChar/text/kaikon.txt +30 -0
- data/example/CountChar/text/nagashimano_shi.txt +45 -0
- data/example/CountChar/text/saikachibuchi.txt +80 -0
- data/example/CountChar/text/saikonihonno_josei.txt +91 -0
- data/example/CountChar/text/taishojugonenno_bundan.txt +21 -0
- data/example/FeatureExample/FeatureExample.pione +7 -0
- data/example/Fib/Fib.pione +56 -0
- data/example/Fib/FibBC.pione +56 -0
- data/example/HelloWorld/HelloWorld.pione +5 -0
- data/example/LucasNumber/LucasNumber.pione +64 -0
- data/example/MakePair/MakePair.pione +14 -0
- data/example/MakePair/data/1.i +0 -0
- data/example/MakePair/data/2.i +0 -0
- data/example/MakePair/data/3.i +0 -0
- data/example/MakePair/data/4.i +0 -0
- data/example/MakePair/data/5.i +0 -0
- data/example/SieveOfEratosthenes/SieveOfEratosthenes.pione +61 -0
- data/example/SingleParticlesWithRef/Makefile +289 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.Makefile +153 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.pione +116 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRefFull.pione +400 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift.pdb +3381 -0
- data/example/SingleParticlesWithRef/data/all.ref2d +0 -0
- data/example/SingleParticlesWithRef/data/all.ref3d +0 -0
- data/example/Sum/Sum.pione +52 -0
- data/example/SyntaxError/call_rule_error.pione +6 -0
- data/example/SyntaxError/feature_line_error.pione +7 -0
- data/example/SyntaxError/flow_block_error.pione +5 -0
- data/example/SyntaxError/input_line_error.pione +6 -0
- data/example/SyntaxError/invalid_rule_name.pione +6 -0
- data/example/SyntaxError/param_line_error.pione +7 -0
- data/example/SyntaxError/variable-binding-error.pione +11 -0
- data/lib/pione.rb +241 -0
- data/lib/pione/agent/basic-agent.rb +333 -0
- data/lib/pione/agent/broker.rb +274 -0
- data/lib/pione/agent/command-listener.rb +47 -0
- data/lib/pione/agent/input-generator.rb +194 -0
- data/lib/pione/agent/logger.rb +65 -0
- data/lib/pione/agent/process-manager.rb +38 -0
- data/lib/pione/agent/rule-provider.rb +64 -0
- data/lib/pione/agent/task-worker.rb +274 -0
- data/lib/pione/agent/trivial-routine-worker.rb +28 -0
- data/lib/pione/agent/tuple-space-client.rb +146 -0
- data/lib/pione/agent/tuple-space-server-client-life-checker.rb +29 -0
- data/lib/pione/command-option/basic-option.rb +42 -0
- data/lib/pione/command-option/child-process-option.rb +17 -0
- data/lib/pione/command-option/common-option.rb +29 -0
- data/lib/pione/command-option/daemon-option.rb +12 -0
- data/lib/pione/command-option/presence-notifier-option.rb +15 -0
- data/lib/pione/command-option/task-worker-owner-option.rb +17 -0
- data/lib/pione/command-option/tuple-space-provider-option.rb +26 -0
- data/lib/pione/command-option/tuple-space-provider-owner-option.rb +16 -0
- data/lib/pione/command-option/tuple-space-receiver-option.rb +12 -0
- data/lib/pione/command/basic-command.rb +126 -0
- data/lib/pione/command/child-process.rb +43 -0
- data/lib/pione/command/daemon-process.rb +18 -0
- data/lib/pione/command/front-owner-command.rb +37 -0
- data/lib/pione/command/pione-broker.rb +53 -0
- data/lib/pione/command/pione-clean.rb +16 -0
- data/lib/pione/command/pione-client.rb +273 -0
- data/lib/pione/command/pione-relay-account-db.rb +85 -0
- data/lib/pione/command/pione-relay-client-db.rb +80 -0
- data/lib/pione/command/pione-relay.rb +47 -0
- data/lib/pione/command/pione-syntax-checker.rb +103 -0
- data/lib/pione/command/pione-task-worker.rb +123 -0
- data/lib/pione/command/pione-tuple-space-provider.rb +87 -0
- data/lib/pione/command/pione-tuple-space-receiver.rb +55 -0
- data/lib/pione/command/pione-tuple-space-viewer.rb +151 -0
- data/lib/pione/command/tuple-space-provider-owner.rb +6 -0
- data/lib/pione/front/basic-front.rb +64 -0
- data/lib/pione/front/broker-front.rb +30 -0
- data/lib/pione/front/client-front.rb +28 -0
- data/lib/pione/front/relay-front.rb +19 -0
- data/lib/pione/front/task-worker-front.rb +16 -0
- data/lib/pione/front/task-worker-owner.rb +42 -0
- data/lib/pione/front/tuple-space-provider-front.rb +22 -0
- data/lib/pione/front/tuple-space-provider-owner.rb +11 -0
- data/lib/pione/front/tuple-space-receiver-front.rb +18 -0
- data/lib/pione/model/assignment.rb +89 -0
- data/lib/pione/model/basic-model.rb +395 -0
- data/lib/pione/model/binary-operator.rb +80 -0
- data/lib/pione/model/block.rb +233 -0
- data/lib/pione/model/boolean.rb +138 -0
- data/lib/pione/model/call-rule.rb +69 -0
- data/lib/pione/model/data-expr.rb +360 -0
- data/lib/pione/model/feature-expr.rb +794 -0
- data/lib/pione/model/float.rb +107 -0
- data/lib/pione/model/integer.rb +140 -0
- data/lib/pione/model/list.rb +104 -0
- data/lib/pione/model/message.rb +80 -0
- data/lib/pione/model/package.rb +48 -0
- data/lib/pione/model/parameters.rb +282 -0
- data/lib/pione/model/rule-expr.rb +120 -0
- data/lib/pione/model/rule-io.rb +166 -0
- data/lib/pione/model/rule.rb +294 -0
- data/lib/pione/model/string.rb +111 -0
- data/lib/pione/model/undefined-value.rb +24 -0
- data/lib/pione/model/variable-table.rb +315 -0
- data/lib/pione/model/variable.rb +87 -0
- data/lib/pione/parser/block-parser.rb +83 -0
- data/lib/pione/parser/common-parser.rb +145 -0
- data/lib/pione/parser/document-parser.rb +58 -0
- data/lib/pione/parser/error-message.yml +4 -0
- data/lib/pione/parser/expr-parser.rb +266 -0
- data/lib/pione/parser/feature-expr-parser.rb +105 -0
- data/lib/pione/parser/flow-element-parser.rb +181 -0
- data/lib/pione/parser/literal-parser.rb +182 -0
- data/lib/pione/parser/rule-definition-parser.rb +163 -0
- data/lib/pione/parser/syntax-error.rb +61 -0
- data/lib/pione/patch/array-patch.rb +3 -0
- data/lib/pione/patch/drb-patch.rb +467 -0
- data/lib/pione/patch/monitor-patch.rb +16 -0
- data/lib/pione/patch/rinda-patch.rb +759 -0
- data/lib/pione/patch/uri-patch.rb +66 -0
- data/lib/pione/relay/receiver-socket.rb +69 -0
- data/lib/pione/relay/relay-account-db.rb +55 -0
- data/lib/pione/relay/relay-client-db.rb +53 -0
- data/lib/pione/relay/relay-socket.rb +215 -0
- data/lib/pione/relay/trampoline.rb +22 -0
- data/lib/pione/relay/transmitter-socket.rb +167 -0
- data/lib/pione/resource/basic-resource.rb +92 -0
- data/lib/pione/resource/dropbox-resource.rb +106 -0
- data/lib/pione/resource/ftp.rb +84 -0
- data/lib/pione/resource/local.rb +113 -0
- data/lib/pione/rule-handler/action-handler.rb +184 -0
- data/lib/pione/rule-handler/basic-handler.rb +217 -0
- data/lib/pione/rule-handler/flow-handler.rb +339 -0
- data/lib/pione/rule-handler/root-handler.rb +23 -0
- data/lib/pione/rule-handler/system-handler.rb +13 -0
- data/lib/pione/system/common.rb +22 -0
- data/lib/pione/system/config.rb +20 -0
- data/lib/pione/system/document.rb +81 -0
- data/lib/pione/system/file-cache.rb +150 -0
- data/lib/pione/system/global.rb +346 -0
- data/lib/pione/system/identifier.rb +61 -0
- data/lib/pione/system/init.rb +16 -0
- data/lib/pione/system/object.rb +35 -0
- data/lib/pione/transformer/block-transformer.rb +23 -0
- data/lib/pione/transformer/document-transformer.rb +36 -0
- data/lib/pione/transformer/expr-transformer.rb +89 -0
- data/lib/pione/transformer/feature-expr-transformer.rb +56 -0
- data/lib/pione/transformer/flow-element-transformer.rb +66 -0
- data/lib/pione/transformer/literal-transformer.rb +76 -0
- data/lib/pione/transformer/rule-definition-transformer.rb +62 -0
- data/lib/pione/transformer/transformer-module.rb +37 -0
- data/lib/pione/tuple-space/data-finder.rb +165 -0
- data/lib/pione/tuple-space/presence-notifier.rb +83 -0
- data/lib/pione/tuple-space/relay.rb +9 -0
- data/lib/pione/tuple-space/tuple-space-provider.rb +85 -0
- data/lib/pione/tuple-space/tuple-space-receiver.rb +140 -0
- data/lib/pione/tuple-space/tuple-space-server-interface.rb +60 -0
- data/lib/pione/tuple-space/tuple-space-server.rb +156 -0
- data/lib/pione/tuple-space/update-criteria.rb +96 -0
- data/lib/pione/tuple/agent-tuple.rb +10 -0
- data/lib/pione/tuple/attribute-tuple.rb +7 -0
- data/lib/pione/tuple/base-uri-tuple.rb +9 -0
- data/lib/pione/tuple/basic-tuple.rb +317 -0
- data/lib/pione/tuple/bye-tuple.rb +9 -0
- data/lib/pione/tuple/command-tuple.rb +9 -0
- data/lib/pione/tuple/data-tuple.rb +18 -0
- data/lib/pione/tuple/dry-run-tuple.rb +8 -0
- data/lib/pione/tuple/exception-tuple.rb +11 -0
- data/lib/pione/tuple/finished-tuple.rb +17 -0
- data/lib/pione/tuple/foreground-tuple.rb +7 -0
- data/lib/pione/tuple/log-tuple.rb +14 -0
- data/lib/pione/tuple/process-info-tuple.rb +9 -0
- data/lib/pione/tuple/request-rule-tuple.rb +9 -0
- data/lib/pione/tuple/rule-tuple.rb +10 -0
- data/lib/pione/tuple/shift-tuple.rb +13 -0
- data/lib/pione/tuple/task-tuple.rb +36 -0
- data/lib/pione/tuple/task-worker-resource-tuple.rb +9 -0
- data/lib/pione/tuple/working-tuple.rb +13 -0
- data/lib/pione/uri-scheme/basic-scheme.rb +40 -0
- data/lib/pione/uri-scheme/broadcast-scheme.rb +11 -0
- data/lib/pione/uri-scheme/dropbox-scheme.rb +9 -0
- data/lib/pione/uri-scheme/local-scheme.rb +28 -0
- data/lib/pione/util/error-report.rb +12 -0
- data/lib/pione/util/log.rb +79 -0
- data/lib/pione/util/message.rb +155 -0
- data/lib/pione/util/misc.rb +73 -0
- data/lib/pione/util/terminal.rb +78 -0
- data/lib/pione/util/waiter-table.rb +53 -0
- data/lib/pione/version.rb +3 -0
- data/misc/env.sh +2 -0
- data/misc/test-drb-stop-service.rb +34 -0
- data/misc/test-ensure-and-thread-kill.rb +40 -0
- data/misc/test-many-waiters-client.rb +56 -0
- data/misc/test-many-waiters-server.rb +14 -0
- data/misc/write_and_take_test.png +0 -0
- data/misc/write_and_take_test.rb +36 -0
- data/pione.gemspec +49 -0
- data/test/agent/spec_basic-agent.rb +170 -0
- data/test/agent/spec_broker.rb +36 -0
- data/test/agent/spec_command-listener.rb +30 -0
- data/test/agent/spec_input-generator.rb +123 -0
- data/test/agent/spec_logger.rb +71 -0
- data/test/agent/spec_rule-provider.rb +65 -0
- data/test/agent/spec_task-worker.rb +307 -0
- data/test/agent/spec_tuple-space-client.rb +30 -0
- data/test/model/spec_assignment.rb +51 -0
- data/test/model/spec_binary-operator.rb +39 -0
- data/test/model/spec_block.rb +154 -0
- data/test/model/spec_boolean.rb +115 -0
- data/test/model/spec_call-rule.rb +23 -0
- data/test/model/spec_data-expr.rb +312 -0
- data/test/model/spec_feature-expr.rb +359 -0
- data/test/model/spec_feature-expr.yml +16 -0
- data/test/model/spec_float.rb +141 -0
- data/test/model/spec_integer.rb +141 -0
- data/test/model/spec_list.rb +26 -0
- data/test/model/spec_message.rb +42 -0
- data/test/model/spec_package.rb +15 -0
- data/test/model/spec_parameters.rb +148 -0
- data/test/model/spec_rule-expr.rb +66 -0
- data/test/model/spec_rule-io.rb +32 -0
- data/test/model/spec_rule.rb +158 -0
- data/test/model/spec_string.rb +106 -0
- data/test/model/spec_variable-table.rb +117 -0
- data/test/model/spec_variable.rb +84 -0
- data/test/parser/spec_block-parser.rb +5 -0
- data/test/parser/spec_block-parser.yml +85 -0
- data/test/parser/spec_common-parser.rb +281 -0
- data/test/parser/spec_expr-parser.rb +6 -0
- data/test/parser/spec_expr-parser.yml +82 -0
- data/test/parser/spec_feature-expr-parser.rb +32 -0
- data/test/parser/spec_feature-expr-parser.yml +25 -0
- data/test/parser/spec_flow-element-parser.rb +5 -0
- data/test/parser/spec_flow-element-parser.yml +180 -0
- data/test/parser/spec_literal-parser.rb +5 -0
- data/test/parser/spec_literal-parser.yml +123 -0
- data/test/parser/spec_rule-definition-parser.rb +5 -0
- data/test/parser/spec_rule-definition-parser.yml +93 -0
- data/test/patch/spec_rinda-patch.rb +32 -0
- data/test/patch/spec_uri-patch.rb +23 -0
- data/test/rule-handler/spec_action-handler.rb +135 -0
- data/test/rule-handler/spec_flow-handler.rb +127 -0
- data/test/spec_common.rb +14 -0
- data/test/spec_data-finder.rb +88 -0
- data/test/spec_data-finder.yml +115 -0
- data/test/spec_document.rb +76 -0
- data/test/spec_identifier.rb +29 -0
- data/test/spec_log.rb +52 -0
- data/test/spec_object.rb +20 -0
- data/test/spec_resource.rb +73 -0
- data/test/spec_update-criteria.rb +83 -0
- data/test/test-util.rb +223 -0
- data/test/transformer/spec_block-transformer.rb +26 -0
- data/test/transformer/spec_expr-transformer.rb +106 -0
- data/test/transformer/spec_feature-expr-transformer.rb +21 -0
- data/test/transformer/spec_flow-element-transformer.rb +154 -0
- data/test/transformer/spec_literal-transformer.rb +58 -0
- data/test/transformer/spec_rule-definition-transformer.rb +168 -0
- data/test/tuple-space/spec_tuple-space-provider.rb +36 -0
- data/test/tuple-space/spec_tuple-space-receiver.rb +32 -0
- data/test/tuple-space/spec_tuple-space-server.rb +49 -0
- data/test/tuple/spec_basic-tuple.rb +87 -0
- data/test/tuple/spec_data-tuple.rb +85 -0
- data/test/tuple/spec_finished-tuple.rb +61 -0
- data/test/tuple/spec_task-tuple.rb +127 -0
- data/test/tuple/spec_working-tuple.rb +58 -0
- data/test/uri-scheme/spec_broadcast-scheme.rb +40 -0
- data/test/uri-scheme/spec_dropbox-scheme.rb +31 -0
- data/test/uri-scheme/spec_local-scheme.rb +69 -0
- metadata +660 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module RuleHandler
|
|
3
|
+
# FlowHandler represents a handler for flow actions.
|
|
4
|
+
class FlowHandler < BasicHandler
|
|
5
|
+
def self.message_name
|
|
6
|
+
"Flow"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# @api private
|
|
10
|
+
def initialize(*args)
|
|
11
|
+
super
|
|
12
|
+
@data_finder = DataFinder.new(tuple_space_server, @domain)
|
|
13
|
+
@finished = []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Starts to process flow elements. This processes rule application, output
|
|
17
|
+
# search, resource shift, and output validation.
|
|
18
|
+
# @return [void]
|
|
19
|
+
def execute
|
|
20
|
+
# restore data tuples from resource
|
|
21
|
+
restore_data_tuples_from_resource
|
|
22
|
+
# rule application
|
|
23
|
+
apply_rules(@rule.body.eval(@variable_table).elements)
|
|
24
|
+
# find outputs
|
|
25
|
+
find_outputs
|
|
26
|
+
# shift resource
|
|
27
|
+
shift_output_resources
|
|
28
|
+
# check output validation
|
|
29
|
+
validate_outputs
|
|
30
|
+
|
|
31
|
+
return @outputs
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# Restores data tuples from the domain resource.
|
|
37
|
+
# @return [void]
|
|
38
|
+
def restore_data_tuples_from_resource
|
|
39
|
+
uri = root? ? @base_uri : @base_uri + (".%s/%s" % @domain.split("_"))
|
|
40
|
+
if Resource[uri].exist?
|
|
41
|
+
Resource[uri].entries.each do |res|
|
|
42
|
+
write(Tuple[:data].new(@domain, res.basename, res.uri.to_s, res.mtime))
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Applies target input data to rules.
|
|
48
|
+
# @param [Array<CallRule>] callees
|
|
49
|
+
# elements of call rule lines
|
|
50
|
+
# @return [void]
|
|
51
|
+
def apply_rules(callees)
|
|
52
|
+
user_message_begin("Start Rule Application: %s" % handler_digest)
|
|
53
|
+
|
|
54
|
+
# apply flow-element rules
|
|
55
|
+
while true do
|
|
56
|
+
# find updatable rule applications
|
|
57
|
+
applications = select_updatables(find_applicable_rules(callees))
|
|
58
|
+
|
|
59
|
+
unless applications.empty?
|
|
60
|
+
# push task tuples into tuple space
|
|
61
|
+
distribute_tasks(applications)
|
|
62
|
+
else
|
|
63
|
+
break # finish applications
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
user_message_end("End Rule Application: %s" % handler_digest)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Finds applicable flow-element rules with inputs and variables.
|
|
71
|
+
def find_applicable_rules(callees)
|
|
72
|
+
callees.inject([]) do |combinations, callee|
|
|
73
|
+
# eval callee expr by handling rule context
|
|
74
|
+
callee = callee.eval(@variable_table)
|
|
75
|
+
|
|
76
|
+
# find callee rule
|
|
77
|
+
rule = find_callee_rule(callee)
|
|
78
|
+
|
|
79
|
+
# update callee parameters
|
|
80
|
+
@variable_table.variables.each do |var|
|
|
81
|
+
val = @variable_table.get(var)
|
|
82
|
+
unless val == UndefinedValue.new
|
|
83
|
+
if rule.params.keys.include?(var)
|
|
84
|
+
callee.expr.params.set_safety!(var, val)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# eval callee rule by the context
|
|
90
|
+
vtable = callee.expr.params.eval(@variable_table).as_variable_table
|
|
91
|
+
rule = rule.eval(vtable)
|
|
92
|
+
|
|
93
|
+
# check rule status and find combinations
|
|
94
|
+
@data_finder.find(:input, rule.inputs, vtable).each do |res|
|
|
95
|
+
combinations << [
|
|
96
|
+
callee,
|
|
97
|
+
rule,
|
|
98
|
+
res.combination,
|
|
99
|
+
res.variable_table
|
|
100
|
+
]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# find next
|
|
104
|
+
combinations.uniq
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Finds the rule of the callee.
|
|
109
|
+
def find_callee_rule(callee)
|
|
110
|
+
return read(Tuple[:rule].new(rule_path: callee.rule_path), 0).content
|
|
111
|
+
rescue Rinda::RequestExpiredError
|
|
112
|
+
debug_message "Request loading a rule #{callee.rule_path}"
|
|
113
|
+
write(Tuple[:request_rule].new(callee.rule_path))
|
|
114
|
+
tuple = read(Tuple[:rule].new(rule_path: callee.rule_path))
|
|
115
|
+
|
|
116
|
+
# check whether known or unknown
|
|
117
|
+
if tuple.status == :known
|
|
118
|
+
return tuple.content
|
|
119
|
+
else
|
|
120
|
+
raise UnknownRule.new(callee.rule_path)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Finds inputs and variables for flow element rules.
|
|
125
|
+
def select_updatables(combinations)
|
|
126
|
+
combinations.select do |callee, rule, inputs, vtable|
|
|
127
|
+
# task domain
|
|
128
|
+
task_domain = ID.domain_id3(rule, inputs, callee)
|
|
129
|
+
|
|
130
|
+
# import finished tuples's data
|
|
131
|
+
import_finished_outputs(task_domain)
|
|
132
|
+
|
|
133
|
+
# find outputs combination
|
|
134
|
+
outputs_combination = @data_finder.find(
|
|
135
|
+
:output,
|
|
136
|
+
rule.outputs.map{|output| output.eval(vtable)},
|
|
137
|
+
vtable
|
|
138
|
+
).map{|r| r.combination }
|
|
139
|
+
|
|
140
|
+
# no outputs combination means empty list
|
|
141
|
+
outputs_combination = [[]] if outputs_combination.empty?
|
|
142
|
+
|
|
143
|
+
# check update criterias
|
|
144
|
+
outputs_combination.any?{|outputs|
|
|
145
|
+
UpdateCriteria.satisfy?(rule, inputs, outputs, vtable)
|
|
146
|
+
}
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Distributes tasks.
|
|
151
|
+
# @param [Array] applications
|
|
152
|
+
# application informations
|
|
153
|
+
# @return [void]
|
|
154
|
+
def distribute_tasks(applications)
|
|
155
|
+
user_message_begin("Start Task Distribution: %s" % handler_digest)
|
|
156
|
+
canceled = []
|
|
157
|
+
|
|
158
|
+
applications.uniq.each do |callee, rule, inputs, vtable|
|
|
159
|
+
# task domain
|
|
160
|
+
task_domain = ID.domain_id3(rule, inputs, callee)
|
|
161
|
+
|
|
162
|
+
# make a task tuple
|
|
163
|
+
task = Tuple[:task].new(
|
|
164
|
+
rule.rule_path,
|
|
165
|
+
inputs,
|
|
166
|
+
callee.expr.params,
|
|
167
|
+
rule.features,
|
|
168
|
+
task_domain,
|
|
169
|
+
@call_stack + [@domain] # current call stack + caller
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# check if same task exists
|
|
173
|
+
begin
|
|
174
|
+
if need_task?(task)
|
|
175
|
+
# copy input data from the handler domain to task domain
|
|
176
|
+
copy_data_into_domain(inputs, task_domain)
|
|
177
|
+
|
|
178
|
+
# write the task
|
|
179
|
+
write(task)
|
|
180
|
+
|
|
181
|
+
msg = "distributed task %s on %s" % [task.digest, handler_digest]
|
|
182
|
+
user_message(msg, 1)
|
|
183
|
+
|
|
184
|
+
next
|
|
185
|
+
end
|
|
186
|
+
rescue Rinda::RedundantTupleError
|
|
187
|
+
# ignore
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
show "cancel task %s on %s" % [task.digest, handler_digest]
|
|
191
|
+
canceled << task_domain
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# wait to finish threads
|
|
195
|
+
applications.uniq.each do |callee, rule, inputs, vtable|
|
|
196
|
+
# task domain
|
|
197
|
+
task_domain = ID.domain_id3(rule, inputs, callee)
|
|
198
|
+
|
|
199
|
+
# wait to finish the work
|
|
200
|
+
template = Tuple[:finished].new(
|
|
201
|
+
domain: task_domain,
|
|
202
|
+
status: :succeeded
|
|
203
|
+
)
|
|
204
|
+
finished = read(template)
|
|
205
|
+
|
|
206
|
+
unless canceled.include?(task_domain)
|
|
207
|
+
msg = "finished task %s on %s" % [finished.domain, handler_digest]
|
|
208
|
+
user_message(msg, 1)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# copy data from task domain to this domain
|
|
212
|
+
@finished << finished
|
|
213
|
+
copy_data_into_domain(finished.outputs, @domain)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
user_message_end("End Task Distribution: %s" % handler_digest)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Returns true if we need to write the task into the tuple space.
|
|
220
|
+
# @param [Task] task
|
|
221
|
+
# task tuple
|
|
222
|
+
# @return [Boolean]
|
|
223
|
+
# true if we need to write the task into the tuple space
|
|
224
|
+
def need_task?(task)
|
|
225
|
+
not(exist_task?(task) or working?(task))
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# Returns true if the task exists in the tuple space already.
|
|
229
|
+
# @param [Task] task
|
|
230
|
+
# task tuple
|
|
231
|
+
# @return [Boolean]
|
|
232
|
+
# true if the task exists in the tuple space already
|
|
233
|
+
def exist_task?(task)
|
|
234
|
+
read0(task)
|
|
235
|
+
return true
|
|
236
|
+
rescue Rinda::RequestExpiredError
|
|
237
|
+
return false
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# Returns true if any task worker is working on the task.
|
|
241
|
+
# @param [Task] task
|
|
242
|
+
# task tuple
|
|
243
|
+
# @return [Boolean]
|
|
244
|
+
# true if any task worker is working on the task
|
|
245
|
+
def working?(task)
|
|
246
|
+
read0(Tuple[:working].new(domain: task.domain))
|
|
247
|
+
return true
|
|
248
|
+
rescue Rinda::RequestExpiredError
|
|
249
|
+
return false
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# Find outputs from the domain.
|
|
253
|
+
# @return [void]
|
|
254
|
+
def find_outputs
|
|
255
|
+
@rule.outputs.each_with_index do |output, i|
|
|
256
|
+
output = output.eval(@variable_table)
|
|
257
|
+
tuples = read_all(Tuple[:data].new(domain: @domain))
|
|
258
|
+
case output.modifier
|
|
259
|
+
when :all
|
|
260
|
+
@outputs[i] = tuples.find_all {|data| output.match(data.name)}
|
|
261
|
+
when :each
|
|
262
|
+
@outputs[i] = tuples.find {|data| output.match(data.name)}
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Shifts output resource locations.
|
|
268
|
+
# @return [void]
|
|
269
|
+
def shift_output_resources
|
|
270
|
+
# cheker for double shift
|
|
271
|
+
shifted = []
|
|
272
|
+
# shift output resources
|
|
273
|
+
@outputs.flatten.compact.each do |output|
|
|
274
|
+
old_uri = URI.parse(output.uri)
|
|
275
|
+
new_uri = URI.parse(make_output_resource_uri(output.name).to_s)
|
|
276
|
+
unless new_uri.path == old_uri.path or shifted.include?(old_uri.path)
|
|
277
|
+
# shift resource
|
|
278
|
+
Resource[new_uri].shift_from(Resource[old_uri])
|
|
279
|
+
# shift cache if the old is cached in this machine
|
|
280
|
+
FileCache.shift(old_uri, new_uri)
|
|
281
|
+
# write shift tuple
|
|
282
|
+
write(Tuple[:shift].new(old_uri.to_s, new_uri.to_s))
|
|
283
|
+
# push moved path
|
|
284
|
+
shifted << old_uri.path
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Validates outputs size.
|
|
290
|
+
def validate_outputs
|
|
291
|
+
# size check
|
|
292
|
+
if @rule.outputs.size > 0 and not(@rule.outputs.size == @outputs.size)
|
|
293
|
+
raise RuleExecutionError.new(self)
|
|
294
|
+
end
|
|
295
|
+
# nil check
|
|
296
|
+
if @outputs.any?{|tuple| tuple.nil?}
|
|
297
|
+
raise RuleExecutionError.new(self)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# empty list check
|
|
301
|
+
if @outputs.any?{|tuple| tuple.kind_of?(Array) && tuple.empty?}
|
|
302
|
+
raise RuleExecutionError.new(self)
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# Imports finished tuple's outputs from the domain.
|
|
307
|
+
# @param [String] task_domain
|
|
308
|
+
# target task domain
|
|
309
|
+
# @return [void]
|
|
310
|
+
def import_finished_outputs(task_domain)
|
|
311
|
+
return if @finished.any?{|t| t.domain == task_domain}
|
|
312
|
+
if task_domain != @domain
|
|
313
|
+
template = Tuple[:finished].new(
|
|
314
|
+
domain: task_domain,
|
|
315
|
+
status: :succeeded
|
|
316
|
+
)
|
|
317
|
+
finished = read0(template)
|
|
318
|
+
copy_data_into_domain(finished.outputs, @domain)
|
|
319
|
+
end
|
|
320
|
+
rescue Rinda::RequestExpiredError
|
|
321
|
+
# ignore
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
# Copy data into specified domain and return the tuple list
|
|
325
|
+
def copy_data_into_domain(src_data, dest_domain)
|
|
326
|
+
src_data.flatten.compact.map do |d|
|
|
327
|
+
new_data = d.clone
|
|
328
|
+
new_data.domain = dest_domain
|
|
329
|
+
begin
|
|
330
|
+
write(new_data)
|
|
331
|
+
rescue Rinda::RedundantTupleError
|
|
332
|
+
# ignore
|
|
333
|
+
end
|
|
334
|
+
new_data
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module RuleHandler
|
|
3
|
+
# RootHandler is a special handler for RootRule.
|
|
4
|
+
class RootHandler < FlowHandler
|
|
5
|
+
def self.message_name
|
|
6
|
+
"Root"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# @api private
|
|
10
|
+
def execute
|
|
11
|
+
# import initial input tuples from input domain
|
|
12
|
+
copy_data_into_domain(@inputs.flatten, @domain)
|
|
13
|
+
# execute the rule
|
|
14
|
+
result = super
|
|
15
|
+
# export outputs to output domain
|
|
16
|
+
copy_data_into_domain(@outputs.flatten, '/output')
|
|
17
|
+
|
|
18
|
+
return result
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module System
|
|
3
|
+
# Starts finalization process for PIONE system. It collects all pione
|
|
4
|
+
# objects from object space and finalize it.
|
|
5
|
+
# @return [void]
|
|
6
|
+
def finalize
|
|
7
|
+
# finalize all innocent white objects
|
|
8
|
+
ObjectSpace.each_object(PioneObject) do |obj|
|
|
9
|
+
obj.finalize
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
module_function :finalize
|
|
13
|
+
|
|
14
|
+
# Sets signal trap for the system.
|
|
15
|
+
# @return [void]
|
|
16
|
+
def set_signal_trap
|
|
17
|
+
finalizer = Proc.new { finalize }
|
|
18
|
+
Signal.trap(:INT, finalizer)
|
|
19
|
+
end
|
|
20
|
+
module_function :set_signal_trap
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module System
|
|
3
|
+
# Config represents a PIONE system configuration.
|
|
4
|
+
class Config < PioneObject
|
|
5
|
+
extend Forwardable
|
|
6
|
+
|
|
7
|
+
attr_reader :path
|
|
8
|
+
def_delegator :@table, "[]"
|
|
9
|
+
|
|
10
|
+
# Creates a new configuration.
|
|
11
|
+
# @param [Hash] data
|
|
12
|
+
# preset configuration table
|
|
13
|
+
def initialize(path)
|
|
14
|
+
@path = Pathname.new(path)
|
|
15
|
+
@table = @path.exist? ? YAML.load(@path.read) : {}
|
|
16
|
+
raise TypeError.new(@path) unless @table.kind_of?(Hash)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module System
|
|
3
|
+
class Document < PioneObject
|
|
4
|
+
# Add ruby shebang line.
|
|
5
|
+
def ruby(str, charset=nil)
|
|
6
|
+
res = "#!/usr/bin/env ruby\n"
|
|
7
|
+
res << "# -*- coding: #{charset} -*-\n" if charset
|
|
8
|
+
return res + str
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Load a rule document and return it.
|
|
12
|
+
def self.load(filepath)
|
|
13
|
+
parse(File.read(filepath))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Parse a rule document string.
|
|
17
|
+
def self.parse(src)
|
|
18
|
+
# parse the document and build the model
|
|
19
|
+
parser = Parser::DocumentParser.new
|
|
20
|
+
transformer = Transformer::DocumentTransformer.new
|
|
21
|
+
toplevels = transformer.apply(parser.parse(src))
|
|
22
|
+
|
|
23
|
+
# rules and assignments
|
|
24
|
+
rules = toplevels.select{|elt| elt.kind_of?(Rule)}
|
|
25
|
+
assignments = toplevels.select{|elt| elt.kind_of?(Assignment)}
|
|
26
|
+
assignments.each {|assignment| assignment.set_toplevel(true)}
|
|
27
|
+
|
|
28
|
+
# make document parameters
|
|
29
|
+
params = assignments.inject(VariableTable.empty) do |vtable, a|
|
|
30
|
+
vtable.tap{|t| t.set(a.variable, a.expr)}
|
|
31
|
+
end.to_params
|
|
32
|
+
|
|
33
|
+
# set document parameters into rules
|
|
34
|
+
rules.each do |rule|
|
|
35
|
+
rule.params.merge!(params)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# make rule table
|
|
39
|
+
table = rules.inject({}) do |tbl, rule|
|
|
40
|
+
tbl.tap{|x| x[rule.rule_path] = rule}
|
|
41
|
+
end
|
|
42
|
+
return new(table, params)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
attr_reader :rules
|
|
46
|
+
|
|
47
|
+
# Creates a document.
|
|
48
|
+
def initialize(rules, params)
|
|
49
|
+
@rules = rules
|
|
50
|
+
@params = params
|
|
51
|
+
instance_eval(&b) if block_given?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Returns the named rule.
|
|
55
|
+
# @param [String] name
|
|
56
|
+
# rule path
|
|
57
|
+
# @return [Pione::Model::Rule]
|
|
58
|
+
def [](name)
|
|
59
|
+
@rules[name].params.merge!(@params)
|
|
60
|
+
@rules[name]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns main rule of main package.
|
|
64
|
+
# @return [Rule]
|
|
65
|
+
# main rule of main package
|
|
66
|
+
def main
|
|
67
|
+
@rules["&main:Main"].params.merge!(@params)
|
|
68
|
+
@rules["&main:Main"]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Returns root rule.
|
|
72
|
+
# @param [Parameters] params
|
|
73
|
+
# root root parameter
|
|
74
|
+
# @return [RootRule]
|
|
75
|
+
# root rule
|
|
76
|
+
def root_rule(params)
|
|
77
|
+
Rule::RootRule.new(main, params.merge(@params))
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|