asir_beanstalk 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ example/*.out
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color -f d
data/Changelog ADDED
@@ -0,0 +1,4 @@
1
+ 2012-12-04 Kurt A. Stephens <ks.git@kurtstephens.com>
2
+
3
+ * v1.1.1: Initial version: Pulled from asir v1.1.0.
4
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in asir_beanstalk.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Kurt Stephens
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # asir_beanstalk
2
+
3
+ Beanstalk ASIR transport.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'asir_beanstalk'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install asir_beanstalk
18
+
19
+ ## Usage
20
+
21
+ See example/.
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ gem 'rspec'
4
+ require 'rspec/core/rake_task'
5
+
6
+ desc "Run specs"
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
9
+ # Put spec opts in a file named .rspec in root
10
+ end
11
+
12
+ desc "Generate code coverage"
13
+ RSpec::Core::RakeTask.new(:coverage) do |t|
14
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
15
+ t.rcov = true
16
+ t.rcov_opts = ['--exclude', 'spec']
17
+ end
18
+
19
+ ######################################################################
20
+
21
+ desc "Default => :test"
22
+ task :default => :test
23
+
24
+ desc "Run all tests"
25
+ task :test => [ :spec ]
26
+
27
+ desc "Run examples."
28
+ task :example do
29
+ ENV["ASIR_EXAMPLE_SILENT"]="1"
30
+ Dir["example/ex[0-9]*.rb"].each do | rb |
31
+ sh %Q{ruby -I example -I lib #{rb}}
32
+ end
33
+ ENV.delete("ASIR_EXAMPLE_SILENT")
34
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- ruby -*-
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'asir_beanstalk/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "asir_beanstalk"
9
+ gem.version = AsirBeanstalk::VERSION
10
+ gem.authors = ["Kurt Stephens"]
11
+ gem.email = ["ks.github@kurtstephens.com"]
12
+ gem.description = %q{Beanstalkd transport for ASIR}
13
+ gem.summary = %q{Beanstalkd transport for ASIR}
14
+ gem.homepage = "http://github.com/kstephens/abstracting_services_in_ruby"
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_dependency "asir", "~> 1.1.0"
22
+
23
+ gem.add_development_dependency 'rake', '>= 0.9.0'
24
+ gem.add_development_dependency 'rspec', '~> 2.12.0'
25
+ gem.add_development_dependency 'simplecov', '>= 0.1'
26
+ end
data/example/ex01.rb ADDED
@@ -0,0 +1,34 @@
1
+ # !SLIDE :capture_code_output true
2
+ # Asynchronous beanstalkd service
3
+
4
+ require 'example_helper'
5
+ require 'asir/transport/beanstalk'
6
+ require 'asir/coder/zlib'
7
+ begin
8
+ Email.asir.transport = t =
9
+ ASIR::Transport::Beanstalk.new(:address => '127.0.0.1', :port => 30904)
10
+ t.encoder =
11
+ ASIR::Coder::Chain.new(:encoders =>
12
+ [ ASIR::Coder::Marshal.new,
13
+ ASIR::Coder::Zlib.new, ])
14
+ t.start_conduit!; sleep 1
15
+ pr Email.asir.send_email(:pdf_invoice,
16
+ :to => "user@email.com", :customer => @customer)
17
+ sleep 2
18
+ server_process do
19
+ t.prepare_server!
20
+ t.run_server!
21
+ end
22
+ rescue Object => err
23
+ $stderr.puts "#{err.inspect}\n#{err.backtrace * "\n"}"
24
+ ensure
25
+ t.close; sleep 3; server_kill; sleep 2
26
+ t.stop_conduit!
27
+ end
28
+
29
+ # !SLIDE END
30
+ # EXPECT: : client process
31
+ # EXPECT: : server process
32
+ # EXPECT: : Email.send_mail :pdf_invoice
33
+ # EXPECT: : pr: nil
34
+
@@ -0,0 +1,77 @@
1
+ # Sample client support
2
+ #
3
+ require 'rubygems'
4
+ case RUBY_PLATFORM
5
+ when /java/i
6
+ gem 'spoon'; require 'spoon'
7
+ end
8
+
9
+ $: << File.expand_path("../../lib", __FILE__)
10
+ gem 'asir'
11
+
12
+ require 'asir'
13
+ require 'asir/coder/chain'
14
+ require 'asir/coder/marshal'
15
+ ASIR::Log.enabled = true unless ENV['ASIR_EXAMPLE_SILENT']
16
+ require 'sample_service'
17
+
18
+ require 'pp'
19
+
20
+ @customer = 123
21
+
22
+ class ::Object
23
+
24
+ def pr result
25
+ $stdout.puts "*** #{$$}: pr: #{PP.pp(result, '')}"
26
+ end
27
+
28
+ def server_process &blk
29
+ # $stderr.puts " at #{__FILE__}:#{__LINE__}"
30
+ case RUBY_PLATFORM
31
+ when /java/i
32
+ # JRuby cannot fork.
33
+ # So we must prevent spawn a new jruby and
34
+ # instruct it to only run the server blk, and not
35
+ # the subsequent client code.
36
+ # In other words, we cannot rely on how Process.fork
37
+ # terminates within the block.
38
+ if ENV['ASIR_JRUBY_SPAWNED']
39
+ $stderr.puts " spawned server at #{__FILE__}:#{__LINE__}"
40
+ puts "*** #{$$}: server process"; $stdout.flush
41
+ yield
42
+ Process.exit!(0)
43
+ # dont do client, client is our parent process.
44
+ else
45
+ $stderr.puts " spawning at #{__FILE__}:#{__LINE__}"
46
+ ENV['ASIR_JRUBY_SPAWNED'] = "1"
47
+ cmd = "ruby -I #{File.dirname(__FILE__)} -I #{File.expand_path('../../lib', __FILE__)} #{$0} #{ARGV * ' '}"
48
+ $stderr.puts " cmd = #{cmd}"
49
+ $server_pid = Spoon.spawnp(cmd)
50
+ ENV.delete('ASIR_JRUBY_SPAWNED')
51
+ $stderr.puts " spawned #{$server_pid} at #{__FILE__}:#{__LINE__}"
52
+ end
53
+ else
54
+ # $stderr.puts " at #{__FILE__}:#{__LINE__}"
55
+ $server_pid = Process.fork do
56
+ puts "*** #{$$}: server process"; $stdout.flush
57
+ yield
58
+ end
59
+ end
60
+ sleep 1 # wait for server to be ready.
61
+ return false # do client.
62
+ end
63
+
64
+ def server_kill
65
+ if $server_pid
66
+ Process.kill 9, $server_pid
67
+ Process.waitpid($server_pid)
68
+ end
69
+ rescue Errno::ESRCH
70
+ ensure
71
+ $server_pid = nil
72
+ end
73
+
74
+ end
75
+
76
+ puts "*** #{$$}: client process"; $stdout.flush
77
+
@@ -0,0 +1,24 @@
1
+ require 'asir'
2
+ # Added .asir support.
3
+ module Email
4
+ include ASIR::Client # Email.asir
5
+ def send_email template_name, options
6
+ $stderr.puts "*** #{$$}: Email.send_mail #{template_name.inspect} #{options.inspect}"
7
+ :ok
8
+ end
9
+ def do_raise msg
10
+ raise msg
11
+ end
12
+ extend self
13
+ end
14
+
15
+ class MyClass
16
+ include ASIR::Client
17
+ def initialize x
18
+ @x = x
19
+ end
20
+ def method_missing sel, *args
21
+ @x.send(sel, *args)
22
+ end
23
+ end
24
+
@@ -0,0 +1,184 @@
1
+ require 'asir/transport/tcp_socket'
2
+
3
+ module ASIR
4
+ class Transport
5
+ # !SLIDE
6
+ # Beanstalk Transport
7
+ class Beanstalk < TcpSocket
8
+ LINE_TERMINATOR = "\r\n".freeze
9
+
10
+ attr_accessor :tube, :priority, :delay, :ttr
11
+
12
+ def initialize *args
13
+ @port ||= 11300
14
+ @tube ||= 'asir'
15
+ @priority ||= 0
16
+ @delay ||= 0
17
+ @ttr ||= 600
18
+ super
19
+ end
20
+
21
+ # !SLIDE
22
+ # Sends the encoded Message payload String.
23
+ def _send_message message, message_payload
24
+ stream.with_stream! do | s |
25
+ begin
26
+ match =
27
+ _beanstalk(s,
28
+ "put #{message[:beanstalk_priority] || @priority} #{message[:beanstalk_delay] || @delay} #{message[:beanstalk_ttr] || @ttr} #{message_payload.size}\r\n",
29
+ /\AINSERTED (\d+)\r\n\Z/,
30
+ message_payload)
31
+ job_id = message[:beanstalk_job_id] = match[1].to_i
32
+ _log { "beanstalk_job_id = #{job_id.inspect}" } if @verbose >= 2
33
+ rescue ::Exception => exc
34
+ message[:beanstalk_error] = exc
35
+ close
36
+ raise exc
37
+ end
38
+ end
39
+ end
40
+
41
+ RESERVE = "reserve\r\n".freeze
42
+
43
+ # !SLIDE
44
+ # Receives the encoded Message payload String.
45
+ def _receive_message channel, additional_data
46
+ channel.with_stream! do | stream |
47
+ begin
48
+ match =
49
+ _beanstalk(stream,
50
+ RESERVE,
51
+ /\ARESERVED (\d+) (\d+)\r\n\Z/)
52
+ additional_data[:beanstalk_job_id] = match[1].to_i
53
+ additional_data[:beanstalk_message_size] =
54
+ size = match[2].to_i
55
+ message_payload = stream.read(size)
56
+ _read_line_and_expect! stream, /\A\r\n\Z/
57
+ # Pass the original stream used to #_send_result below.
58
+ [ message_payload, stream ]
59
+ rescue ::Exception => exc
60
+ _log { [ :_receive_message, :exception, exc ] }
61
+ additional_data[:beanstalk_error] = exc
62
+ channel.close
63
+ raise exc
64
+ end
65
+ end
66
+ end
67
+
68
+ # !SLIDE
69
+ # Sends the encoded Result payload String.
70
+ def _send_result message, result, result_payload, channel, stream
71
+ #
72
+ # There is a possibility here the following could happen:
73
+ #
74
+ # _receive_message
75
+ # channel == #<Channel:1>
76
+ # channel.stream == #<TCPSocket:1234>
77
+ # end
78
+ # ...
79
+ # ERROR OCCURES:
80
+ # channel.stream.close
81
+ # channel.stream = nil
82
+ # ...
83
+ # _send_result
84
+ # channel == #<Channel:1>
85
+ # channel.stream == #<TCPSocket:5678> # NEW CONNECTION
86
+ # stream.write "delete #{job_id}"
87
+ # ...
88
+ #
89
+ # Therefore: _receiver_message passes the original message stream to us.
90
+ # We insure that the same stream is still the active one and use it.
91
+ channel.with_stream! do | maybe_other_stream |
92
+ _log [ :_send_result, "stream lost" ] if maybe_other_stream != stream
93
+ job_id = message[:beanstalk_job_id] or raise "no beanstalk_job_id"
94
+ _beanstalk(stream,
95
+ "delete #{job_id}\r\n",
96
+ /\ADELETED\r\n\Z/)
97
+ end
98
+ end
99
+
100
+ # !SLIDE
101
+ # Receives the encoded Result payload String.
102
+ def _receive_result message, opaque_result
103
+ nil
104
+ end
105
+
106
+ # !SLIDE
107
+ # Sets beanstalk_delay if message.delay was specified.
108
+ def relative_message_delay! message, now = nil
109
+ if delay = super
110
+ message[:beanstalk_delay] = delay.to_i
111
+ end
112
+ delay
113
+ end
114
+
115
+ # !SLIDE
116
+ # Beanstalk protocol support
117
+
118
+ # Send "something ...\r\n".
119
+ # Expect /\ASOMETHING (\d+)...\r\n".
120
+ def _beanstalk stream, message, expect, payload = nil
121
+ _log { [ :_beanstalk, :message, message ] } if @verbose >= 3
122
+ stream.write message
123
+ if payload
124
+ stream.write payload
125
+ stream.write LINE_TERMINATOR
126
+ end
127
+ stream.flush
128
+ if match = _read_line_and_expect!(stream, expect)
129
+ _log { [ :_beanstalk, :result, match[0] ] } if @verbose >= 3
130
+ end
131
+ match
132
+ end
133
+
134
+ def _after_connect! stream
135
+ if @tube
136
+ _beanstalk(stream,
137
+ "use #{@tube}\r\n",
138
+ /\AUSING #{@tube}\r\n\Z/)
139
+ end
140
+ end
141
+
142
+ # !SLIDE
143
+ # Beanstalk Server
144
+ def _server!
145
+ _log { "_server! #{uri}" } if @verbose >= 1
146
+ @server = connect!(:try_max => nil,
147
+ :try_sleep => 1,
148
+ :try_sleep_increment => 0.1,
149
+ :try_sleep_max => 10) do | stream |
150
+ if @tube
151
+ _beanstalk(stream,
152
+ "watch #{@tube}\r\n",
153
+ /\AWATCHING (\d+)\r\n\Z/)
154
+ end
155
+ end
156
+ self
157
+ end
158
+
159
+ def _server_accept_connection! server
160
+ prepare_server! unless @server
161
+ [ @server, @server ]
162
+ end
163
+
164
+ def _server_close_connection! in_stream, out_stream
165
+ # NOTHING
166
+ end
167
+
168
+ def stream_eof? stream
169
+ # Note: stream.eof? on a beanstalkd connection,
170
+ # will cause blocking read *forever* because
171
+ # beanstalk connections are long lived.
172
+ false
173
+ end
174
+
175
+ def _start_conduit!
176
+ addr = address ? "-l #{address} " : ""
177
+ cmd = "beanstalkd #{addr}-p #{port}"
178
+ exec(cmd)
179
+ end
180
+ end
181
+ # !SLIDE END
182
+ end # class
183
+ end # module
184
+
@@ -0,0 +1,8 @@
1
+ require "asir_beanstalk/version"
2
+
3
+ module AsirBeanstalk
4
+ end
5
+
6
+ gem 'asir'
7
+ require 'asir'
8
+ require 'asir/transport/beanstalk'
@@ -0,0 +1,3 @@
1
+ module AsirBeanstalk
2
+ VERSION = "1.1.1"
3
+ end
@@ -0,0 +1,88 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ $:.unshift File.expand_path('../../example', __FILE__)
4
+
5
+ describe "ASIR Example" do
6
+ attr_accessor :file, :expects
7
+
8
+ before(:each) do
9
+ @expects = [ ]
10
+ end
11
+
12
+ after(:each) do
13
+ @file.should_not == nil
14
+ File.open(@file) do | fh |
15
+ until fh.eof?
16
+ line = fh.readline
17
+ line.chomp!
18
+ case
19
+ when line.sub!(/^\s*#\s*EXPECT\/:\s*/, '')
20
+ expect Regexp.new(line)
21
+ when line.sub!(/^\s*#\s*EXPECT!\/:\s*/, '')
22
+ expect Regexp.new(line), :'!~'
23
+ when line.sub!(/^\s*#\s*EXPECT:\s*/, '')
24
+ expect Regexp.new(Regexp.escape(line))
25
+ when line.sub!(/^\s*#\s*EXPECT!:\s*/, '')
26
+ expect Regexp.new(Regexp.escape(line)), :'!~'
27
+ end
28
+ end
29
+ end
30
+ @output, @exit_code = run_file!(@file)
31
+ @exit_code.should == 0
32
+ @expects.empty?.should_not == true
33
+ @expects.each do | rx, mode |
34
+ $stderr.puts " Checking #{mode} #{rx.inspect}" if ENV['SPEC_VERBOSE']
35
+ case mode
36
+ when :'=~'
37
+ @output.should =~ rx
38
+ when :'!~'
39
+ @output.should_not =~ rx
40
+ else
41
+ raise ArgumentError
42
+ end
43
+ end
44
+ end
45
+
46
+ def run_file! file, output = StringIO.new('')
47
+ progname_save, stdout_save, stderr_save = $0, $stdout, $stderr
48
+ exc = system_exit = nil; exit_code = 0
49
+ begin
50
+ if true
51
+ cmd = "ASIR_EXAMPLE_SILENT=1 ruby -I example -I lib #{file}"
52
+ $stderr.puts "\n Running #{cmd}:" if ENV['SPEC_VERBOSE']
53
+ output = `#{cmd} 2>&1 | tee #{file}.out`
54
+ else
55
+ $stderr.puts "\n Loading #{file}:" if ENV['SPEC_VERBOSE']
56
+ $stdout.puts "*** #{$$}: client process"; $stdout.flush
57
+ $stdout = $stderr = output
58
+ $0 = file
59
+ Kernel.load(file, true)
60
+ output = output.string if StringIO === output
61
+ end
62
+ rescue ::SystemExit => system_exit
63
+ exit_code = 1 # ???
64
+ rescue ::Exception => exc
65
+ exit_code = -1
66
+ end
67
+ [ output, exit_code ]
68
+ ensure
69
+ $0, $stdout, $stderr = progname_save, stdout_save, stderr_save
70
+ $stderr.write output if ENV['SPEC_VERBOSE']
71
+ if exc
72
+ stderr_save.puts "ERROR: #{file}: #{exc.inspect}\n#{exc.backtrace * "\n"}"
73
+ raise exc
74
+ end
75
+ end
76
+
77
+ def expect rx, mode = :'=~'
78
+ @expects << [ rx, mode ]
79
+ end
80
+
81
+ Dir['example/**/ex[0-9]*.rb'].sort.each do | file |
82
+ title = File.open(file) { | fh | fh.read(4096) }
83
+ title = title =~ /#\s+!SLIDE[^\n]*\n\s*#\s*([^\n]+)/ && $1
84
+ it "#{file} - #{title}" do
85
+ @file = file
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ gem 'asir'
5
+ require 'asir'
6
+
7
+ module ASIR
8
+ module Test
9
+ class TestError < ::Exception; end
10
+ class TestObject
11
+ include ASIR::Client
12
+ attr_accessor :spec, :arg, :cls, :msg, :transport, :message
13
+ def initialize spec
14
+ @spec = spec
15
+ end
16
+
17
+ def get_data!
18
+ @transport = ASIR::Transport.current
19
+ @message = @transport && @transport.message
20
+ end
21
+
22
+ def return_argument arg
23
+ get_data!
24
+ @arg = arg
25
+ arg
26
+ end
27
+
28
+ def raise_exception! cls, msg
29
+ get_data!
30
+ @cls = cls
31
+ @msg = msg
32
+ raise cls, msg
33
+ end
34
+ end
35
+ end
36
+ end
37
+
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asir_beanstalk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kurt Stephens
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: asir
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.9.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.12.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.12.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0.1'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0.1'
78
+ description: Beanstalkd transport for ASIR
79
+ email:
80
+ - ks.github@kurtstephens.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - .rspec
87
+ - Changelog
88
+ - Gemfile
89
+ - LICENSE.txt
90
+ - README.md
91
+ - Rakefile
92
+ - asir_beanstalk.gemspec
93
+ - example/ex01.rb
94
+ - example/example_helper.rb
95
+ - example/sample_service.rb
96
+ - lib/asir/transport/beanstalk.rb
97
+ - lib/asir_beanstalk.rb
98
+ - lib/asir_beanstalk/version.rb
99
+ - spec/example_spec.rb
100
+ - spec/spec_helper.rb
101
+ homepage: http://github.com/kstephens/abstracting_services_in_ruby
102
+ licenses: []
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ segments:
114
+ - 0
115
+ hash: -1937949383851329736
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ segments:
123
+ - 0
124
+ hash: -1937949383851329736
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 1.8.24
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: Beanstalkd transport for ASIR
131
+ test_files:
132
+ - spec/example_spec.rb
133
+ - spec/spec_helper.rb