cloud_flow 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/cloud_flow.rb +72 -0
- data/lib/flow_method.rb +3 -0
- 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
|
data/lib/flow_method.rb
ADDED
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: []
|