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,22 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Relay
|
|
3
|
+
class Trampoline
|
|
4
|
+
def initialize(uri, config)
|
|
5
|
+
@obj = DRb::DRbObject.new_with_uri(uri)
|
|
6
|
+
@protocol = TransmitterSocket.open_server(uri, config)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
undef :to_s
|
|
10
|
+
|
|
11
|
+
def method_missing(msg_id, *arg, &b)
|
|
12
|
+
req_id = @protocol.send_request(@obj, msg_id, arg, b)
|
|
13
|
+
@protocol.reader_thread
|
|
14
|
+
succ, result = DRb.waiter_table.take(req_id, msg_id, arg)
|
|
15
|
+
unless succ
|
|
16
|
+
raise result
|
|
17
|
+
end
|
|
18
|
+
return result
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Relay
|
|
3
|
+
# TransmitterSocket is a connection layer from PIONE relay to PIONE client.
|
|
4
|
+
class TransmitterSocket < DRb::DRbTCPSocket
|
|
5
|
+
class TransmitterSocketError < Exception; end
|
|
6
|
+
|
|
7
|
+
@@receiver_socket = {}
|
|
8
|
+
@@proxy_socket = {}
|
|
9
|
+
|
|
10
|
+
def self.receiver_socket
|
|
11
|
+
@@receiver_socket
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.proxy_socket
|
|
15
|
+
@@proxy_socket
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Parses special URI for reverse scheme.
|
|
19
|
+
def self.parse_uri(uri)
|
|
20
|
+
if uri =~ /^transmitter:\/\/([\w-]+)(\?(.*))?$/
|
|
21
|
+
transmitter_id = $1
|
|
22
|
+
option = $3
|
|
23
|
+
return transmitter_id, option
|
|
24
|
+
else
|
|
25
|
+
raise DRb::DRbBadScheme.new(uri) unless uri =~ /^transmitter:/
|
|
26
|
+
raise DRb::DRbBadURI.new('can\'t parse uri:' + uri)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Creates a fake connection from proxy to relay transmitter.
|
|
31
|
+
# @api private
|
|
32
|
+
def self.open(uri, config)
|
|
33
|
+
# reverse socket needs URI always
|
|
34
|
+
raise ArgumentError.new("You should specify transmitter URI.") unless uri
|
|
35
|
+
|
|
36
|
+
# get transmitter_id
|
|
37
|
+
transmitter_id, _ = parse_uri(uri)
|
|
38
|
+
transmitter_id.untaint
|
|
39
|
+
|
|
40
|
+
# get proxy side socket
|
|
41
|
+
soc = @@proxy_socket[transmitter_id]
|
|
42
|
+
unless soc
|
|
43
|
+
msg = "No receiver side socket for %s." % transmitter_id
|
|
44
|
+
raise TransmitterSocketError.new(msg)
|
|
45
|
+
end
|
|
46
|
+
proxy_socket = TCPSocket.new("localhost", soc.addr[1])
|
|
47
|
+
|
|
48
|
+
# create instance with proxy socket
|
|
49
|
+
self.new(uri, nil, proxy_socket, config)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Opens a fake socket.
|
|
53
|
+
def self.open_server(uri, config)
|
|
54
|
+
# the method needs URI explicitly
|
|
55
|
+
raise ArgumentError.new("You should specify transmitter URI.") unless uri
|
|
56
|
+
|
|
57
|
+
# get transmitter_id
|
|
58
|
+
transmitter_id, _ = parse_uri(uri)
|
|
59
|
+
transmitter_id.untaint
|
|
60
|
+
|
|
61
|
+
# get receiver side socket
|
|
62
|
+
receiver_socket = @@receiver_socket[transmitter_id]
|
|
63
|
+
unless receiver_socket
|
|
64
|
+
msg = "No receiver side sockets for %s." % transmitter_id
|
|
65
|
+
raise TransmitterSocketError.new(msg)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# get proxy side socket
|
|
69
|
+
proxy_socket = @@proxy_socket[transmitter_id]
|
|
70
|
+
unless proxy_socket
|
|
71
|
+
msg = "No proxy side sockets for %s." % transmitter_id
|
|
72
|
+
raise TransmitterSocketError.new(msg)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# create instance with receiver and proxy sockets
|
|
76
|
+
self.new(uri, receiver_socket, proxy_socket, config)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.uri_option(uri, config)
|
|
80
|
+
transmitter_id, option = parse_uri(uri)
|
|
81
|
+
return "transmitter://%s" % transmitter_id, option
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def initialize(uri, receiver_socket, proxy_socket, config)
|
|
85
|
+
@uri = uri
|
|
86
|
+
@receiver_socket = receiver_socket
|
|
87
|
+
@proxy_socket = proxy_socket
|
|
88
|
+
@config = config
|
|
89
|
+
@acl = config[:tcp_acl]
|
|
90
|
+
@receiver_msg = DRb::DRbMessage.new(config)
|
|
91
|
+
@proxy_msg = DRb::DRbMessage.new(config)
|
|
92
|
+
set_sockopt(@receiver_socket) if @receiver_socket
|
|
93
|
+
set_sockopt(@proxy_socket) if @proxy_socket
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Sends a request from transmitter to receiver.
|
|
97
|
+
# @api private
|
|
98
|
+
def send_request(ref, msg_id, arg, b)
|
|
99
|
+
if @receiver_socket
|
|
100
|
+
ref = DRbObject.new_with_uri("receiver://%s:%s" % ["localhost", Global.relay_port])
|
|
101
|
+
#p ref.__drburi if ref.kind_of?(DRbObject)
|
|
102
|
+
#p msg_id
|
|
103
|
+
#p arg
|
|
104
|
+
@receiver_msg.send_request(@receiver_socket, ref, msg_id, arg, b)
|
|
105
|
+
else
|
|
106
|
+
@proxy_msg.send_request(@proxy_socket, ref, msg_id, arg, b)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Receives a request from proxy to transmitter.
|
|
111
|
+
# @api private
|
|
112
|
+
def recv_request
|
|
113
|
+
@proxy_msg.recv_request(@proxy_socket)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Sends a reply from transmitter to proxy.
|
|
117
|
+
# @api private
|
|
118
|
+
def send_reply(req_id, succ, result)
|
|
119
|
+
@proxy_msg.send_reply(req_id, @proxy_socket, succ, result)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Receives a reply from receiver to transmitter.
|
|
123
|
+
# @api private
|
|
124
|
+
def recv_reply
|
|
125
|
+
if @receiver_socket
|
|
126
|
+
@receiver_msg.recv_reply(@receiver_socket)
|
|
127
|
+
else
|
|
128
|
+
@proxy_msg.recv_reply(@proxy_socket)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Closes proxy side socket.
|
|
133
|
+
def close
|
|
134
|
+
@proxy_socket.close
|
|
135
|
+
@proxy_socket = nil
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Opens fake connection from proxy to transmitter.
|
|
139
|
+
# Just returns self.
|
|
140
|
+
def accept
|
|
141
|
+
while true
|
|
142
|
+
soc = @proxy_socket.accept
|
|
143
|
+
break if (@acl ? @acl.allow_socket?(soc) : true)
|
|
144
|
+
soc.close
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
if Global.show_communication
|
|
148
|
+
puts "proxy connects to transmitter"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# create instance
|
|
152
|
+
self.class.new(uri, nil, soc, @config)
|
|
153
|
+
rescue => e
|
|
154
|
+
soc.close
|
|
155
|
+
if Global.show_communication
|
|
156
|
+
puts "closed transmitter's proxy side socket"
|
|
157
|
+
puts "%s: %s" % [e.class, e.message]
|
|
158
|
+
caller.each {|line| puts " %s" % line}
|
|
159
|
+
end
|
|
160
|
+
retry
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# install the protocol
|
|
165
|
+
DRb::DRbProtocol.add_protocol(TransmitterSocket)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
# Resource is a module for data resources.
|
|
3
|
+
module Resource
|
|
4
|
+
# ResourceError is raised when any resource errors happen.
|
|
5
|
+
class ResourceError < Exception
|
|
6
|
+
def initialize(uri)
|
|
7
|
+
@uri = uri
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class NotFound < ResourceError; end
|
|
12
|
+
|
|
13
|
+
# @api private
|
|
14
|
+
@@schemes = {}
|
|
15
|
+
|
|
16
|
+
# Returns the resource object corresponding to the uri.
|
|
17
|
+
# @return [BasicResource]
|
|
18
|
+
# resouce object
|
|
19
|
+
def self.[](uri)
|
|
20
|
+
uri = uri.kind_of?(::URI::Generic) ? uri : ::URI.parse(uri)
|
|
21
|
+
@@schemes[uri.scheme].new(uri)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# BasicResource is an interface class for all resouce classes.
|
|
25
|
+
class BasicResource
|
|
26
|
+
attr_reader :uri
|
|
27
|
+
attr_reader :path
|
|
28
|
+
|
|
29
|
+
# Creates a data resource on URI.
|
|
30
|
+
# @param [String] data
|
|
31
|
+
# data content
|
|
32
|
+
# @return[void]
|
|
33
|
+
def create(data)
|
|
34
|
+
raise NotImplementedError
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Reads a resource data from URI.
|
|
38
|
+
# @return [String]
|
|
39
|
+
# data content
|
|
40
|
+
def read
|
|
41
|
+
raise NotImplementedError
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Updates a resource data on URI.
|
|
45
|
+
# @param [String] data
|
|
46
|
+
# new data content
|
|
47
|
+
# @return [void]
|
|
48
|
+
def update(data)
|
|
49
|
+
raise NotImplementedError
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Deletes a resource data on URI.
|
|
53
|
+
# @return [void]
|
|
54
|
+
def delete
|
|
55
|
+
raise NotImplementedError
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns mtime of the resource.
|
|
59
|
+
# @return [Time]
|
|
60
|
+
# mtime
|
|
61
|
+
def mtime
|
|
62
|
+
raise NotImplementedError
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Returns entries of the resource path.
|
|
66
|
+
# @return [Array<Resource>]
|
|
67
|
+
# resource entries of the resource path
|
|
68
|
+
def entries
|
|
69
|
+
raise NotImplementedError
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Returns the basename of resource.
|
|
73
|
+
# @return [String]
|
|
74
|
+
# basename
|
|
75
|
+
def basename
|
|
76
|
+
raise NotImplementedError
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def exist?
|
|
80
|
+
raise NotImplementedError
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def link_to(dist)
|
|
84
|
+
raise NotImplementedError
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def link_from(dist)
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Resource
|
|
3
|
+
class Dropbox < BasicResource
|
|
4
|
+
def self.init(tuple_space_server)
|
|
5
|
+
tuple_consumer_key = Tuple[:attribute].new("dropbox_consumer_key", nil)
|
|
6
|
+
tuple_consumer_secret = Tuple[:attribute].new("dropbox_consumer_secret", nil)
|
|
7
|
+
tuple_access_token_key = Tuple[:attribute].new("dropbox_access_token_key", nil)
|
|
8
|
+
tuple_access_token_secret = Tuple[:attribute].new("dropbox_access_token_secret", nil)
|
|
9
|
+
|
|
10
|
+
consumer_key = tuple_space_server.read(tuple_consumer_key, 0).value rescue nil
|
|
11
|
+
consumer_secret = tuple_space_server.read(tuple_consumer_secret, 0).value rescue nil
|
|
12
|
+
access_token_key = tuple_space_server.read(tuple_access_token_key, 0).value rescue nil
|
|
13
|
+
access_token_secret = tuple_space_server.read(tuple_access_token_secret, 0).value rescue nil
|
|
14
|
+
|
|
15
|
+
@session = DropboxSession.new(consumer_key, consumer_secret)
|
|
16
|
+
@session.set_access_token(access_token_key, access_token_secret)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.share_access_token(tuple_space_server, consumer_key, consumer_secret)
|
|
20
|
+
access_token = session.get_access_token
|
|
21
|
+
[ Tuple[:attribute].new("dropbox_consumer_key", consumer_key),
|
|
22
|
+
Tuple[:attribute].new("dropbox_consumer_secret", consumer_secret),
|
|
23
|
+
Tuple[:attribute].new("dropbox_access_token_key", access_token.key),
|
|
24
|
+
Tuple[:attribute].new("dropbox_access_token_secret", access_token.secret)
|
|
25
|
+
].each {|tuple| tuple_space_server.write(tuple) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.ready?
|
|
29
|
+
@session.authorized?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.set_session(session)
|
|
33
|
+
@session = session
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.session
|
|
37
|
+
@session
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def initialize(uri)
|
|
41
|
+
@uri = uri.kind_of?(URI::Generic) ? uri : URI.parse(uri)
|
|
42
|
+
raise ArgumentError unless @uri.kind_of?(Pione::URIScheme::DropboxScheme)
|
|
43
|
+
@path = uri.path
|
|
44
|
+
@client = DropboxClient.new(self.class.session, "app_folder")
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def create(data)
|
|
48
|
+
@client.put_file(@path, StringIO.new(data))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def read
|
|
52
|
+
@client.get_file(@path)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def update(data)
|
|
56
|
+
@client.put_file(@path, StringIO.new(data), true)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def delete
|
|
60
|
+
@client.delete_file(@path)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def mtime
|
|
64
|
+
metadata = @client.metadata(@path)
|
|
65
|
+
Time.parse(metadata["modified"])
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def entries
|
|
69
|
+
metadata = @client.metadata(@path)
|
|
70
|
+
if not(metadata["is_dir"]) or metadata["is_deleted"]
|
|
71
|
+
raise NotFound.new(self)
|
|
72
|
+
end
|
|
73
|
+
metadata["contents"].select{|entry| not(entry["is_dir"]) and not(entry["is_deleted"])}.map do |entry|
|
|
74
|
+
Resource["dropbox:%s" % entry["path"]]
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def basename
|
|
79
|
+
Pathname.new(@path).basename.to_s
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def exist?
|
|
83
|
+
metadata = @client.metadata(@path)
|
|
84
|
+
return not(metadata["is_deleted"])
|
|
85
|
+
rescue DropboxError
|
|
86
|
+
return false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def link_to(dist)
|
|
90
|
+
File.open(dist, "w") do |out|
|
|
91
|
+
out.write read
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def link_from(other)
|
|
96
|
+
update(File.read(other))
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def shift_from(other)
|
|
100
|
+
@client.file_move(other.path, @path)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
@@schemes['dropbox'] = Dropbox
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Resource
|
|
3
|
+
# FTP represents resources on FTP server.
|
|
4
|
+
class FTP < BasicResource
|
|
5
|
+
# Creates a resouce.
|
|
6
|
+
# @param [String, ::URI] uri
|
|
7
|
+
# resource URI
|
|
8
|
+
def initialize(uri)
|
|
9
|
+
@uri = uri.kind_of?(::URI::Generic) ? uri : ::URI.parse(uri)
|
|
10
|
+
raise ArgumentError unless @uri.kind_of?(::URI::FTP)
|
|
11
|
+
@path = uri.path
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# (see BasicResource#create)
|
|
15
|
+
def create(data)
|
|
16
|
+
Net::FTP.open(@uri.host, @uri.user, @uri.password) do |ftp|
|
|
17
|
+
pathes = @path.split('/')
|
|
18
|
+
makedirs(ftp, pathes)
|
|
19
|
+
t = Tempfile.open("aaa")
|
|
20
|
+
t.write(data)
|
|
21
|
+
t.close(false)
|
|
22
|
+
ftp.put(t.path, @path)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# (see BasicResource#read)
|
|
27
|
+
def read
|
|
28
|
+
begin
|
|
29
|
+
tempfile = Tempfile.new("test")
|
|
30
|
+
Net::FTP.open(@uri.host, @uri.user, @uri.password) do |ftp|
|
|
31
|
+
ftp.get(@path, tempfile.path)
|
|
32
|
+
end
|
|
33
|
+
File.read(tempfile.path)
|
|
34
|
+
rescue Net::FTPPermErrro
|
|
35
|
+
raise NotFound.new(@uri)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# (see BasicResource#update)
|
|
40
|
+
def update(data)
|
|
41
|
+
Net::FTP.open(@uri.host, @uri.user, @uri.password) do |ftp|
|
|
42
|
+
begin
|
|
43
|
+
ftp.dir(File.dirname(@path))
|
|
44
|
+
t = Tempfile.open("aaa")
|
|
45
|
+
t.write(data)
|
|
46
|
+
t.close(false)
|
|
47
|
+
ftp.put(t.path, @path)
|
|
48
|
+
rescue Net::FTPPermErrro
|
|
49
|
+
raise NotFound.new(@uri)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# (see BasicResource#delete)
|
|
55
|
+
def delete
|
|
56
|
+
Net::FTP.open(@uri.host, @uri.user, @uri.password) do |ftp|
|
|
57
|
+
ftp.delete(@path)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# (see BasicResource#copy_to)
|
|
62
|
+
def copy_to(dist)
|
|
63
|
+
FileUtil.symlink(@path, dist)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# @api private
|
|
69
|
+
def makedirs(ftp, path, size=0)
|
|
70
|
+
unless path.size == size + 1
|
|
71
|
+
pa = File.join(*path[0..size])
|
|
72
|
+
begin
|
|
73
|
+
ftp.mkdir(pa)
|
|
74
|
+
rescue Net::FTPPermError
|
|
75
|
+
ensure
|
|
76
|
+
makedirs(ftp, path, size+1)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
@@schemes['ftp'] = FTP
|
|
83
|
+
end
|
|
84
|
+
end
|