cloud_flow 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []