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 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: []