async_service 0.1.4
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/.autotest +1 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/Gemfile +14 -0
- data/Guardfile +6 -0
- data/README.md +33 -0
- data/Rakefile +41 -0
- data/async_service.gemspec +35 -0
- data/lib/async_service.rb +1 -0
- data/lib/mobme/infrastructure/service.rb +6 -0
- data/lib/mobme/infrastructure/service/version.rb +10 -0
- data/lib/mobme/infrastructure/service/worker.rb +26 -0
- data/spec/mobme/infrastructure/service/worker_spec.rb +74 -0
- data/spec/spec_helper.rb +9 -0
- metadata +192 -0
data/.autotest
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'autotest/bundler'
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
## Description
|
3
|
+
|
4
|
+
AsyncService provides an abstraction for workers/daemons that processes work from a queue. Often an AsyncService::Worker will get work from a queue, process it and push the result back into another queue.
|
5
|
+
|
6
|
+
You can also take a look at [SyncService](https://github.com/mobmewireless/sync_service) which provides abstractions for synchronous SOA.
|
7
|
+
|
8
|
+
## Install
|
9
|
+
|
10
|
+
$ gem install async_service
|
11
|
+
|
12
|
+
## Creating a Worker
|
13
|
+
|
14
|
+
class CalculatorMachine < AsyncService::Worker
|
15
|
+
# You need to set a service name
|
16
|
+
@service_name = 'in.mobme.calculator_machine'
|
17
|
+
|
18
|
+
# This function is called on run
|
19
|
+
def work
|
20
|
+
loop do
|
21
|
+
queue.remove("work_queue") do |item|
|
22
|
+
result = item[:a] + item[:b]
|
23
|
+
|
24
|
+
queue.add("result_queue", result)
|
25
|
+
end
|
26
|
+
sleep 5
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
calculator = CalculatorMachine.new
|
32
|
+
calculator.run
|
33
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require "rake/tasklib"
|
3
|
+
require "flog"
|
4
|
+
require 'ci/reporter/rake/rspec'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec => ["ci:setup:rspec"]) do |t|
|
7
|
+
t.pattern = 'spec/**/*_spec.rb'
|
8
|
+
end
|
9
|
+
|
10
|
+
task :default => :spec
|
11
|
+
|
12
|
+
desc "Analyze for code complexity"
|
13
|
+
task :flog do
|
14
|
+
flog = Flog.new
|
15
|
+
flog.flog [ "lib" ]
|
16
|
+
threshold = 10
|
17
|
+
|
18
|
+
bad_methods = flog.totals.select do | name, score |
|
19
|
+
name != "main#none" && score > threshold
|
20
|
+
end
|
21
|
+
bad_methods.sort do | a, b |
|
22
|
+
a[ 1 ] <=> b[ 1 ]
|
23
|
+
end.reverse.each do | name, score |
|
24
|
+
puts "%8.1f: %s" % [ score, name ]
|
25
|
+
end
|
26
|
+
unless bad_methods.empty?
|
27
|
+
raise "#{ bad_methods.size } methods have a flog complexity > #{ threshold }"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
namespace :gem do
|
32
|
+
task :push do
|
33
|
+
puts "Building gem from gemspec..."
|
34
|
+
system("gem build *.gemspec")
|
35
|
+
puts "Pushing up gem to gems.mobme.in..."
|
36
|
+
system("scp -P 2200 *.gem mobme@gems.mobme.in:/home/mobme/public_html/gems.mobme.in/gems")
|
37
|
+
puts "Rebuilding index..."
|
38
|
+
system('ssh mobme@gems.mobme.in -p 2200 "cd /home/mobme/public_html/gems.mobme.in && /usr/local/rvm/bin/rvm 1.9.2 gem generate_index"')
|
39
|
+
puts "Done"
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
lib = File.expand_path('../lib/', __FILE__)
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
require 'mobme/infrastructure/service/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "async_service"
|
8
|
+
s.version = AsyncService::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.authors = ["MobME"]
|
11
|
+
s.email = ["engineering@mobme.in"]
|
12
|
+
s.homepage = "http://mobme.in/"
|
13
|
+
s.summary = %q{AsyncService is a library to create asynchronous SOA daemons}
|
14
|
+
s.description = %q{The gem provides an abstraction for asynchronous workers that poll data from a queue and do work}
|
15
|
+
|
16
|
+
s.required_rubygems_version = ">= 1.3.6"
|
17
|
+
|
18
|
+
s.add_development_dependency "rspec"
|
19
|
+
s.add_development_dependency "rake"
|
20
|
+
s.add_development_dependency "guard"
|
21
|
+
s.add_development_dependency "guard-rspec"
|
22
|
+
s.add_development_dependency "simplecov"
|
23
|
+
s.add_development_dependency "flog"
|
24
|
+
s.add_development_dependency "yard"
|
25
|
+
s.add_development_dependency "ci_reporter"
|
26
|
+
s.add_development_dependency "simplecov-rcov"
|
27
|
+
|
28
|
+
s.add_dependency "hiredis", "~> 0.3.1"
|
29
|
+
s.add_dependency "redis", "~> 2.2.0"
|
30
|
+
s.add_dependency "true_queue", "~> 0.9"
|
31
|
+
|
32
|
+
s.files = `git ls-files`.split("\n") - ["Gemfile.lock", ".rvmrc"]
|
33
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative "mobme/infrastructure/service"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
module MobME::Infrastructure::Service
|
3
|
+
class Worker
|
4
|
+
def self.service_name
|
5
|
+
@service_name
|
6
|
+
end
|
7
|
+
|
8
|
+
def logger
|
9
|
+
@logger ||= Logger.new(STDOUT)
|
10
|
+
end
|
11
|
+
|
12
|
+
def queue(type = :redis, options = {})
|
13
|
+
TrueQueue.queue(type, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
begin
|
18
|
+
logger.info "Starting #{self.class}.."
|
19
|
+
work
|
20
|
+
rescue StandardError => e
|
21
|
+
logger.err(e.backtrace.unshift(e.inspect).join("\n"))
|
22
|
+
raise
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'async_service'
|
4
|
+
|
5
|
+
class DummyWorker < AsyncService::Worker
|
6
|
+
@service_name = 'infrastructure-service-worker-dummy'
|
7
|
+
end
|
8
|
+
|
9
|
+
describe DummyWorker do
|
10
|
+
describe "class" do
|
11
|
+
it "should define a service name" do
|
12
|
+
DummyWorker.service_name.should_not be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it { should respond_to(:queue) }
|
17
|
+
it { should respond_to(:queue).with(1).argument }
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@dummy_worker = DummyWorker.new
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should log and re-raise any uncaught errors while running" do
|
24
|
+
dummy_worker = DummyWorker.new
|
25
|
+
dummy_worker.logger.should_receive(:err)
|
26
|
+
lambda { dummy_worker.run }.should raise_error
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#logger" do
|
30
|
+
let(:dummy_logger) { double Logger }
|
31
|
+
|
32
|
+
it "returns a logger instance" do
|
33
|
+
Logger.should_receive(:new).with(STDOUT).and_return(dummy_logger)
|
34
|
+
subject.logger
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when called more than once" do
|
38
|
+
it "returns the same logger instance" do
|
39
|
+
Logger.stub(:new).and_return(dummy_logger)
|
40
|
+
subject.logger.should be dummy_logger
|
41
|
+
subject.logger.should be dummy_logger
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "queue" do
|
47
|
+
let(:dummy_work_queue) { double('Queue').as_null_object }
|
48
|
+
|
49
|
+
before :each do
|
50
|
+
TrueQueue.stub!(:queue).and_return(dummy_work_queue)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should return a connected queue with a same name as the service_name" do
|
54
|
+
TrueQueue.should_receive(:queue).with(:redis, {}).and_return(dummy_work_queue)
|
55
|
+
@dummy_worker.queue
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when options are passed" do
|
59
|
+
it "passes on the options to Queue.queue" do
|
60
|
+
options = double("Options", :empty? => false)
|
61
|
+
TrueQueue.should_receive(:queue).with(:redis, options)
|
62
|
+
@dummy_worker.queue(:redis, options)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "passes on the type to Queue.queue" do
|
66
|
+
TrueQueue.should_receive(:queue).with(:memory, {})
|
67
|
+
@dummy_worker.queue(:memory)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: async_service
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- MobME
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70285336936780 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70285336936780
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70285336936280 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70285336936280
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: guard
|
38
|
+
requirement: &70285336935840 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70285336935840
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: guard-rspec
|
49
|
+
requirement: &70285336935400 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70285336935400
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: simplecov
|
60
|
+
requirement: &70285336934920 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70285336934920
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: flog
|
71
|
+
requirement: &70285336934480 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70285336934480
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: yard
|
82
|
+
requirement: &70285336934000 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70285336934000
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: ci_reporter
|
93
|
+
requirement: &70285336933540 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70285336933540
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: simplecov-rcov
|
104
|
+
requirement: &70285336932940 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *70285336932940
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: hiredis
|
115
|
+
requirement: &70285336932160 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ~>
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 0.3.1
|
121
|
+
type: :runtime
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: *70285336932160
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: redis
|
126
|
+
requirement: &70285336931520 !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.2.0
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: *70285336931520
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: true_queue
|
137
|
+
requirement: &70285336930840 !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ~>
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0.9'
|
143
|
+
type: :runtime
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: *70285336930840
|
146
|
+
description: The gem provides an abstraction for asynchronous workers that poll data
|
147
|
+
from a queue and do work
|
148
|
+
email:
|
149
|
+
- engineering@mobme.in
|
150
|
+
executables: []
|
151
|
+
extensions: []
|
152
|
+
extra_rdoc_files: []
|
153
|
+
files:
|
154
|
+
- .autotest
|
155
|
+
- .gitignore
|
156
|
+
- .rspec
|
157
|
+
- Gemfile
|
158
|
+
- Guardfile
|
159
|
+
- README.md
|
160
|
+
- Rakefile
|
161
|
+
- async_service.gemspec
|
162
|
+
- lib/async_service.rb
|
163
|
+
- lib/mobme/infrastructure/service.rb
|
164
|
+
- lib/mobme/infrastructure/service/version.rb
|
165
|
+
- lib/mobme/infrastructure/service/worker.rb
|
166
|
+
- spec/mobme/infrastructure/service/worker_spec.rb
|
167
|
+
- spec/spec_helper.rb
|
168
|
+
homepage: http://mobme.in/
|
169
|
+
licenses: []
|
170
|
+
post_install_message:
|
171
|
+
rdoc_options: []
|
172
|
+
require_paths:
|
173
|
+
- lib
|
174
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
176
|
+
requirements:
|
177
|
+
- - ! '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
none: false
|
182
|
+
requirements:
|
183
|
+
- - ! '>='
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: 1.3.6
|
186
|
+
requirements: []
|
187
|
+
rubyforge_project:
|
188
|
+
rubygems_version: 1.8.10
|
189
|
+
signing_key:
|
190
|
+
specification_version: 3
|
191
|
+
summary: AsyncService is a library to create asynchronous SOA daemons
|
192
|
+
test_files: []
|