cloud_flow 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/cloud_flow.rb +72 -0
  3. data/lib/flow_method.rb +3 -0
  4. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 264e0c36847fc01a6400b66829640d88103ac747
4
+ data.tar.gz: e34820c6e782cf015d013581ff2aba5f878ff33a
5
+ SHA512:
6
+ metadata.gz: 2686a2958245ba902353348516253e439c0499830fe5ba600fe924c2ee76c2d8c90a69404bd15c5ee409e6e7c54b07ed0da845c271369c4adb2aaaaf8faf84dd
7
+ data.tar.gz: ce732b8bee3cd29cc96795b97a466511e6a32ebcf26ba498f947e85873b59df19ef1ab103cb23bf0793d90307888de3aca38c9c55d0e305fc2589002185d6117
data/lib/cloud_flow.rb ADDED
@@ -0,0 +1,72 @@
1
+ require_relative 'flow_method'
2
+
3
+ class CloudFlow
4
+ # @param name [String] defines namespace. then it sees SQS Queue: 'cloudflow_#{name}'
5
+ def initialize(name)
6
+ @namespace = name
7
+ sqs = AWS::SQS.new
8
+ @queue = sqs.queues.named("cloudflow_#{@namespace}")
9
+ end
10
+
11
+ # regist func correspond to given func name.
12
+ # please avoid 'on', 'poll' since they are used already by CloudFlow.
13
+ # flow.on(:somefunc, &blk) generates flow#somefunc which is used to call the work.
14
+ # @param name [String] the work's name.
15
+ # @param block [Block] the work.
16
+ def on(name, &block)
17
+ define_sending_method(name)
18
+ define_receiving_method(name, &block)
19
+ end
20
+
21
+ # starts its work.
22
+ def start
23
+ @queue.poll do |msg|
24
+ perform_message(msg)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ # defines method which does send message to SQS
31
+ def define_sending_method(name)
32
+ self.class.send(:define_method, name) do |*args|
33
+ @queue.send_message build_method_call(name, *args)
34
+ end
35
+ end
36
+
37
+ # defines method which performs desired work.
38
+ def define_receiving_method(name, &block)
39
+ self.class.send(:define_method, "_#{name}") do |*args|
40
+ block.call(*args)
41
+ end
42
+ end
43
+
44
+ # @param msg [AWS::SQS::ReceivedMessage]
45
+ def perform_message(msg)
46
+ flow = parse_message(msg)
47
+ self.send("_#{flow.name}", *flow.args)
48
+ rescue
49
+ puts "undefined method: #{msg.body}"
50
+ end
51
+
52
+ # @param msg [AWS::SQS::ReceivedMessage]
53
+ # @return [FlowMethod]
54
+ def parse_message(msg)
55
+ parse_method_call(msg.body)
56
+ end
57
+
58
+ # builds method_call which is like foobar(1,2,3) or foobar(foo,bar)
59
+ # @return [String]
60
+ def build_method_call(name, *args)
61
+ "#{name.to_s}(#{args.join(",")})"
62
+ end
63
+
64
+ # @param method_call [String] built by #build_method_call
65
+ # @return [FlowMethod]
66
+ def parse_method_call(method_call)
67
+ m = FlowMethod.new
68
+ m.name = method_call.split('(')[0]
69
+ m.args = method_call.split('(')[1].split(')')[0].split(",") rescue []
70
+ m
71
+ end
72
+ end
@@ -0,0 +1,3 @@
1
+ class FlowMethod
2
+ attr_accessor :name, :args
3
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloud_flow
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kai Inui
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Write multi-instance workflow easily
14
+ email: me@kaiinui.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/cloud_flow.rb
20
+ - lib/flow_method.rb
21
+ homepage: https://github.com/kaiinui/CloudFlow
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.2.2
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: SQS Powered Multi-instance coding made easy
45
+ test_files: []