async_service 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/.autotest ADDED
@@ -0,0 +1 @@
1
+ require 'autotest/bundler'
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ \vendor/
2
+ .bundle/
3
+ coverage/
4
+ spec/reports
5
+ *.log
6
+ .yardoc
7
+ *.gem
8
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --profile
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source "http://gems.mobme.in"
2
+ source :rubygems
3
+
4
+ group :osx do
5
+ gem "growl"
6
+ gem 'rb-fsevent'
7
+ end
8
+
9
+ group :linux do
10
+ gem "rb-inotify"
11
+ gem "libnotify"
12
+ end
13
+
14
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+
2
+ guard 'rspec', :version => 2 do
3
+ watch(%r{^spec/.+_spec\.rb$})
4
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
5
+ watch('spec/spec_helper.rb') { "spec" }
6
+ end
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,6 @@
1
+ require 'logger'
2
+ require 'true_queue'
3
+
4
+ require 'mobme/infrastructure/service/version'
5
+ require 'mobme/infrastructure/service/worker'
6
+
@@ -0,0 +1,10 @@
1
+ module MobME
2
+ module Infrastructure
3
+ module Service
4
+ VERSION = "0.1.4"
5
+ end
6
+ end
7
+ end
8
+
9
+ # alias it!
10
+ AsyncService = 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
+
@@ -0,0 +1,9 @@
1
+ require 'simplecov'
2
+ require 'simplecov-rcov'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
5
+ SimpleCov.start do
6
+ add_filter 'vendor'
7
+ add_filter 'spec'
8
+ end if ENV["COVERAGE"]
9
+
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: []