officer 0.9.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ coverage
2
+ rdoc
3
+ doc
4
+ .yardoc
5
+ .bundle
6
+ pkg
7
+ .DS_Store
8
+ *.tmproj
9
+ tmtags
10
+ *~
11
+ \#*
12
+ .\#*
13
+ *.swp
14
+ *.rbc
15
+ .rvmrc
16
+ .project
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in officer.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ officer (0.10.0)
5
+ choice
6
+ daemons
7
+ eventmachine
8
+ json
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ choice (0.1.6)
14
+ daemons (1.1.8)
15
+ diff-lcs (1.1.3)
16
+ eventmachine (0.12.10)
17
+ json (1.7.3)
18
+ rake (0.9.2.2)
19
+ rspec (2.10.0)
20
+ rspec-core (~> 2.10.0)
21
+ rspec-expectations (~> 2.10.0)
22
+ rspec-mocks (~> 2.10.0)
23
+ rspec-core (2.10.1)
24
+ rspec-expectations (2.10.0)
25
+ diff-lcs (~> 1.1.3)
26
+ rspec-mocks (2.10.1)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ officer!
33
+ rake
34
+ rspec
data/LICENSE CHANGED
@@ -1,4 +1,6 @@
1
- Copyright (c) 2010 Chad Remesch
1
+ Copyright (c) 2012 Chad Remesch
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
@@ -17,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
19
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
20
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
21
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,46 +1,34 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- require 'jeweler'
5
- Jeweler::Tasks.new do |gem|
6
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
7
- gem.name = "officer"
8
- gem.homepage = "http://github.com/chadrem/officer"
9
- gem.license = "MIT"
10
- gem.summary = %Q{Ruby lock server and client built on EventMachine.}
11
- gem.description = %Q{Officer is designed to help you coordinate distributed processes and avoid race conditions.}
12
- gem.email = "chad@remesch.com"
13
- gem.authors = ["Chad Remesch"]
14
- # Include your dependencies below. Runtime dependencies are required when using your gem,
15
- # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
16
- # gem.add_development_dependency 'rspec', '2.4.0'
17
- gem.add_dependency "eventmachine", ">= 0"
18
- gem.add_dependency "json", ">= 0"
19
- gem.add_dependency "daemons", ">= 0"
20
- gem.add_dependency "choice", ">= 0"
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
21
3
 
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts 'Run `bundle install` to install missing gems'
11
+ exit e.status_code
22
12
  end
23
- Jeweler::RubygemsDotOrgTasks.new
24
13
 
25
- require 'rspec/core'
26
- require 'rspec/core/rake_task'
27
- RSpec::Core::RakeTask.new(:spec) do |spec|
28
- spec.pattern = FileList['spec/**/*_spec.rb']
29
- end
14
+ task :default => :spec
30
15
 
31
- RSpec::Core::RakeTask.new(:rcov) do |spec|
32
- spec.pattern = 'spec/**/*_spec.rb'
33
- spec.rcov = true
34
- end
16
+ desc 'Start an IRB console with offier loaded'
17
+ task :console do
18
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
35
19
 
36
- task :default => :spec
20
+ require 'officer'
21
+ require 'irb'
22
+
23
+ ARGV.clear
37
24
 
38
- require 'rake/rdoctask'
39
- Rake::RDocTask.new do |rdoc|
40
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
25
+ IRB.start
26
+ end
41
27
 
42
- rdoc.rdoc_dir = 'rdoc'
43
- rdoc.title = "officer #{version}"
44
- rdoc.rdoc_files.include('README*')
45
- rdoc.rdoc_files.include('lib/**/*.rb')
28
+ desc 'Run all specs'
29
+ task :spec do
30
+ puts 'Running rspec:'
31
+ system 'rspec spec'
46
32
  end
33
+
34
+ task :default => :spec
@@ -1,9 +1,3 @@
1
- require 'socket'
2
- require 'fcntl'
3
-
4
- require 'rubygems'
5
- require 'json'
6
-
7
1
  module Officer
8
2
 
9
3
  class GenericError < RuntimeError; end
@@ -12,6 +6,7 @@ module Officer
12
6
  class LockTimeoutError < LockError; end
13
7
  class LockQueuedMaxError < LockError; end
14
8
  class UnlockError < GenericError; end
9
+ class SocketResponseError < GenericError; end
15
10
 
16
11
  class Client
17
12
  def initialize options={}
@@ -20,6 +15,10 @@ module Officer
20
15
  @host = options[:host] || 'localhost'
21
16
  @port = options[:port] || 11500
22
17
  @namespace = options[:namespace]
18
+ @keep_alive_freq = options[:keep_alive_freq] || 6 # Hz.
19
+ @keep_alive_enabled = options.include?(:keep_alive_enabled) ? options[:keep_alive_enabled] : true
20
+ @thread = nil
21
+ @lock = Mutex.new
23
22
 
24
23
  connect
25
24
  end
@@ -27,22 +26,43 @@ module Officer
27
26
  def reconnect
28
27
  disconnect
29
28
  connect
29
+
30
+ self
30
31
  end
31
32
 
32
33
  def disconnect
33
- @socket.close if @socket
34
- @socket = nil
34
+ @lock.synchronize do
35
+ @thread.terminate if @thread
36
+ @thread = nil
37
+
38
+ @socket.close if @socket
39
+ @socket = nil
40
+ end
41
+
42
+ self
35
43
  end
36
44
 
37
45
  def lock name, options={}
38
46
  result = execute :command => 'lock', :name => name_with_ns(name),
39
47
  :timeout => options[:timeout], :queue_max => options[:queue_max]
40
48
  strip_ns_from_hash result, 'name'
49
+
50
+ if result['name'] != name || !%w(acquired already_acquired timed_out queue_maxed).include?(result['result'])
51
+ force_shutdown
52
+ end
53
+
54
+ result
41
55
  end
42
56
 
43
57
  def unlock name
44
58
  result = execute :command => 'unlock', :name => name_with_ns(name)
45
59
  strip_ns_from_hash result, 'name'
60
+
61
+ if result['name'] != name || !%w(released release_failed).include?(result['result'])
62
+ force_shutdown
63
+ end
64
+
65
+ result
46
66
  end
47
67
 
48
68
  def with_lock name, options={}
@@ -66,44 +86,85 @@ module Officer
66
86
  end
67
87
 
68
88
  def reset
69
- execute :command => 'reset'
89
+ result = execute :command => 'reset'
90
+
91
+ if result['result'] != 'reset_succeeded'
92
+ force_shutdown
93
+ end
94
+
95
+ result
70
96
  end
71
97
 
72
98
  def locks
73
- execute :command => 'locks'
99
+ result = execute :command => 'locks'
100
+
101
+ if result['result'] != 'locks'
102
+ force_shutdown
103
+ end
104
+
105
+ result
74
106
  end
75
107
 
76
108
  def connections
77
- execute :command => 'connections'
109
+ result = execute :command => 'connections'
110
+
111
+ if result['result'] != 'connections'
112
+ force_shutdown
113
+ end
114
+
115
+ result
78
116
  end
79
117
 
80
118
  def my_locks
81
119
  result = execute :command => 'my_locks'
82
120
  result['value'] = result['value'].map {|name| strip_ns(name)}
121
+
122
+ if result['result'] != 'my_locks'
123
+ force_shutdown
124
+ end
125
+
83
126
  result
84
127
  end
85
128
 
86
129
  private
87
130
  def connect
88
- raise AlreadyConnectedError if @socket
89
-
90
- case @socket_type
91
- when 'TCP'
92
- @socket = TCPSocket.new @host, @port.to_i
93
- when 'UNIX'
94
- @socket = UNIXSocket.new @socket_file
95
- else
96
- raise "Invalid socket type: #{@socket_type}"
97
- end
131
+ @lock.synchronize do
132
+ raise AlreadyConnectedError if @socket
133
+
134
+ case @socket_type
135
+ when 'TCP'
136
+ @socket = TCPSocket.new @host, @port.to_i
137
+ when 'UNIX'
138
+ @socket = UNIXSocket.new @socket_file
139
+ else
140
+ raise "Invalid socket type: #{@socket_type}"
141
+ end
142
+
143
+ @socket.fcntl Fcntl::F_SETFD, Fcntl::FD_CLOEXEC
144
+ @socket.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1
98
145
 
99
- @socket.fcntl Fcntl::F_SETFD, Fcntl::FD_CLOEXEC
146
+ @thread = Thread.new { thread_main } unless @thread && @thread.alive?
147
+ end
100
148
  end
101
149
 
102
150
  def execute command
103
- command = command.to_json
104
- @socket.write command + "\n"
105
- result = @socket.gets "\n"
106
- JSON.parse result.chomp
151
+ @lock.synchronize do
152
+ command = command.to_json
153
+ @socket.write command + "\n"
154
+
155
+ result = nil
156
+
157
+ while true
158
+ rs = IO.select([@socket], nil, nil, sleep_sec)
159
+
160
+ if rs.nil?
161
+ keep_alive
162
+ else
163
+ result = @socket.gets "\n"
164
+ return JSON.parse result.chomp
165
+ end
166
+ end
167
+ end
107
168
  rescue
108
169
  reconnect
109
170
  raise
@@ -121,6 +182,44 @@ module Officer
121
182
  hash[key] = strip_ns(hash[key])
122
183
  hash
123
184
  end
185
+
186
+ def sleep_sec
187
+ 60.0 / @keep_alive_freq
188
+ end
189
+
190
+ # This method assumes the calling thread already holds @lock.
191
+ def keep_alive
192
+ return unless @keep_alive_enabled
193
+ return unless @socket
194
+
195
+ command = { :command => 'keep_alive' }
196
+ @socket.write command.to_json + "\n"
197
+ nil
198
+ end
199
+
200
+ def thread_main
201
+ while true
202
+ sleep(sleep_sec)
203
+
204
+ if @lock.try_lock
205
+ begin
206
+ keep_alive
207
+ rescue Exception => e
208
+ ensure
209
+ @lock.unlock
210
+ end
211
+ end
212
+ end
213
+ end
214
+
215
+ def force_shutdown
216
+ begin
217
+ disconnect
218
+ rescue Exception => e
219
+ ensure
220
+ raise SocketResponseError
221
+ end
222
+ end
124
223
  end
125
224
 
126
225
  end
@@ -26,7 +26,7 @@ module Officer
26
26
  def initialize connection, request
27
27
  @connection = connection
28
28
  @request = request
29
-
29
+
30
30
  setup
31
31
 
32
32
  raise('Invalid request') unless valid?
@@ -135,5 +135,11 @@ module Officer
135
135
  end
136
136
  end
137
137
 
138
+ class KeepAlive < Base
139
+ register
140
+
141
+ def execute
142
+ end
143
+ end
138
144
  end
139
- end
145
+ end
@@ -5,6 +5,7 @@ module Officer
5
5
  def post_init
6
6
  @connected = true
7
7
  @timers = {} # name => Timer
8
+ @last_cmd_at = Time.now.utc
8
9
 
9
10
  Officer::Log.info "Connected: #{to_host_s}"
10
11
  end
@@ -16,6 +17,7 @@ module Officer
16
17
 
17
18
  command = Officer::Command::Factory.create line, self
18
19
  command.execute
20
+ @last_cmd_at = Time.now.utc
19
21
 
20
22
  rescue Exception => e
21
23
  Officer::Log.error e
@@ -91,6 +93,8 @@ module Officer
91
93
  include EmCallbacks
92
94
  include LockStoreCallbacks
93
95
 
96
+ attr_reader :last_cmd_at
97
+
94
98
  def to_host_s
95
99
  begin
96
100
  @to_host_s ||= non_cached_to_host_s
@@ -100,6 +104,10 @@ module Officer
100
104
  end
101
105
  end
102
106
 
107
+ def received_keep_alive
108
+
109
+ end
110
+
103
111
  private
104
112
  attr_reader :connected
105
113
 
@@ -142,7 +142,7 @@ module Officer
142
142
  @locks.each do |name, lock|
143
143
  locks[name] = lock.queue.to_host_a
144
144
  end
145
-
145
+
146
146
  connection.locks locks
147
147
  end
148
148
 
@@ -160,6 +160,12 @@ module Officer
160
160
  my_locks = @connections[connection] ? @connections[connection].to_a : []
161
161
  connection.my_locks my_locks
162
162
  end
163
+
164
+ def watchdog
165
+ @connections.each do |conn, names|
166
+
167
+ end
168
+ end
163
169
  end
164
170
 
165
171
  end
@@ -31,7 +31,10 @@ module Officer
31
31
 
32
32
  EM::run do
33
33
  if @params[:stats]
34
- EM::PeriodicTimer.new(5) {Officer::LockStore.instance.log_state}
34
+ EM::PeriodicTimer.new(5) do
35
+ Officer::LockStore.instance.log_state
36
+ Officer::LockStore.instance.watchdog
37
+ end
35
38
  end
36
39
 
37
40
  if @enable_shutdown_port
@@ -0,0 +1,3 @@
1
+ module Officer
2
+ VERSION = "0.10.0"
3
+ end
data/lib/officer.rb CHANGED
@@ -4,6 +4,8 @@ require 'set'
4
4
  require 'logger'
5
5
  require 'delegate'
6
6
  require 'thread'
7
+ require 'socket'
8
+ require 'fcntl'
7
9
 
8
10
  # Gems.
9
11
  require 'rubygems'
@@ -11,9 +13,9 @@ require 'eventmachine'
11
13
  require 'json'
12
14
  require 'daemons'
13
15
  require 'choice'
14
- # require 'ruby-debug'
15
16
 
16
17
  # Application.
18
+ require 'officer/version'
17
19
  require 'officer/log'
18
20
  require 'officer/commands'
19
21
  require 'officer/connection'
data/officer.gemspec CHANGED
@@ -1,69 +1,25 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/officer/version', __FILE__)
5
3
 
6
- Gem::Specification.new do |s|
7
- s.name = "officer"
8
- s.version = "0.9.2"
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ['Chad Remesch']
6
+ gem.email = ['chad@remesch.com']
7
+ gem.description = 'Officer is designed to help you coordinate distributed processes and avoid race conditions.'
8
+ gem.summary = 'Ruby lock server and client built on EventMachine.'
9
+ gem.homepage = 'http://github.com/chadrem/officer'
9
10
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Chad Remesch"]
12
- s.date = "2012-03-16"
13
- s.description = "Officer is designed to help you coordinate distributed processes and avoid race conditions."
14
- s.email = "chad@remesch.com"
15
- s.executables = ["officer"]
16
- s.extra_rdoc_files = [
17
- "LICENSE",
18
- "README.markdown"
19
- ]
20
- s.files = [
21
- ".autotest",
22
- ".document",
23
- ".rspec",
24
- "CONTRIBUTORS",
25
- "LICENSE",
26
- "README.markdown",
27
- "Rakefile",
28
- "VERSION",
29
- "bin/officer",
30
- "lib/officer.rb",
31
- "lib/officer/client.rb",
32
- "lib/officer/commands.rb",
33
- "lib/officer/connection.rb",
34
- "lib/officer/lock_store.rb",
35
- "lib/officer/log.rb",
36
- "lib/officer/runner.rb",
37
- "lib/officer/server.rb",
38
- "officer.gemspec",
39
- "spec/integration/officer_spec.rb",
40
- "spec/spec_helper.rb"
41
- ]
42
- s.homepage = "http://github.com/chadrem/officer"
43
- s.licenses = ["MIT"]
44
- s.require_paths = ["lib"]
45
- s.rubygems_version = "1.8.17"
46
- s.summary = "Ruby lock server and client built on EventMachine."
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = 'officer'
15
+ gem.require_paths = ['lib']
16
+ gem.version = Officer::VERSION
47
17
 
48
- if s.respond_to? :specification_version then
49
- s.specification_version = 3
18
+ gem.add_dependency('eventmachine', ['>= 0'])
19
+ gem.add_dependency('json', ['>= 0'])
20
+ gem.add_dependency('daemons', ['>= 0'])
21
+ gem.add_dependency('choice', ['>= 0'])
50
22
 
51
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
- s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
53
- s.add_runtime_dependency(%q<json>, [">= 0"])
54
- s.add_runtime_dependency(%q<daemons>, [">= 0"])
55
- s.add_runtime_dependency(%q<choice>, [">= 0"])
56
- else
57
- s.add_dependency(%q<eventmachine>, [">= 0"])
58
- s.add_dependency(%q<json>, [">= 0"])
59
- s.add_dependency(%q<daemons>, [">= 0"])
60
- s.add_dependency(%q<choice>, [">= 0"])
61
- end
62
- else
63
- s.add_dependency(%q<eventmachine>, [">= 0"])
64
- s.add_dependency(%q<json>, [">= 0"])
65
- s.add_dependency(%q<daemons>, [">= 0"])
66
- s.add_dependency(%q<choice>, [">= 0"])
67
- end
23
+ gem.add_development_dependency('rake', ['>= 0'])
24
+ gem.add_development_dependency('rspec', ['>= 0'])
68
25
  end
69
-
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,18 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
- require 'rspec'
4
- require "benchmark"
5
- require "json"
3
+
4
+ require 'rubygems'
5
+ require 'bundler'
6
+
7
+ begin
8
+ Bundler.setup(:default, :development)
9
+ rescue Bundler::BundlerError => e
10
+ $stderr.puts e.message
11
+ $stderr.puts 'Run `bundle install` to install missing gems'
12
+ exit e.status_code
13
+ end
14
+
15
+ require 'benchmark'
6
16
  require 'officer'
7
17
 
8
18
  # Requires supporting files with custom matchers and macros, etc,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: officer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-16 00:00:00.000000000 Z
12
+ date: 2012-06-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &70325432692700 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70325432692700
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: json
27
- requirement: &70325432692140 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70325432692140
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: daemons
38
- requirement: &70325432691660 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70325432691660
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: choice
49
- requirement: &70325432691180 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,25 +69,61 @@ dependencies:
54
69
  version: '0'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *70325432691180
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rspec
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
58
110
  description: Officer is designed to help you coordinate distributed processes and
59
111
  avoid race conditions.
60
- email: chad@remesch.com
112
+ email:
113
+ - chad@remesch.com
61
114
  executables:
62
115
  - officer
63
116
  extensions: []
64
- extra_rdoc_files:
65
- - LICENSE
66
- - README.markdown
117
+ extra_rdoc_files: []
67
118
  files:
68
- - .autotest
69
- - .document
119
+ - .gitignore
70
120
  - .rspec
71
121
  - CONTRIBUTORS
122
+ - Gemfile
123
+ - Gemfile.lock
72
124
  - LICENSE
73
125
  - README.markdown
74
126
  - Rakefile
75
- - VERSION
76
127
  - bin/officer
77
128
  - lib/officer.rb
78
129
  - lib/officer/client.rb
@@ -82,12 +133,12 @@ files:
82
133
  - lib/officer/log.rb
83
134
  - lib/officer/runner.rb
84
135
  - lib/officer/server.rb
136
+ - lib/officer/version.rb
85
137
  - officer.gemspec
86
138
  - spec/integration/officer_spec.rb
87
139
  - spec/spec_helper.rb
88
140
  homepage: http://github.com/chadrem/officer
89
- licenses:
90
- - MIT
141
+ licenses: []
91
142
  post_install_message:
92
143
  rdoc_options: []
93
144
  require_paths:
@@ -98,16 +149,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
149
  - - ! '>='
99
150
  - !ruby/object:Gem::Version
100
151
  version: '0'
152
+ segments:
153
+ - 0
154
+ hash: -2483715139742074305
101
155
  required_rubygems_version: !ruby/object:Gem::Requirement
102
156
  none: false
103
157
  requirements:
104
158
  - - ! '>='
105
159
  - !ruby/object:Gem::Version
106
160
  version: '0'
161
+ segments:
162
+ - 0
163
+ hash: -2483715139742074305
107
164
  requirements: []
108
165
  rubyforge_project:
109
- rubygems_version: 1.8.17
166
+ rubygems_version: 1.8.23
110
167
  signing_key:
111
168
  specification_version: 3
112
169
  summary: Ruby lock server and client built on EventMachine.
113
- test_files: []
170
+ test_files:
171
+ - spec/integration/officer_spec.rb
172
+ - spec/spec_helper.rb
data/.autotest DELETED
@@ -1,10 +0,0 @@
1
- # Override autotest default magic to rerun all tests every time a
2
- # change is detected on the file system.
3
- class Autotest
4
- def get_to_green
5
- begin
6
- rerun_all_tests
7
- wait_for_changes unless all_good
8
- end until all_good
9
- end
10
- end
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.9.2