active_record_mutex 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,3 @@
1
- pkg
2
- Gemfile.lock
3
1
  .*.sw[pon]
2
+ Gemfile.lock
3
+ pkg
data/README.rdoc CHANGED
@@ -2,16 +2,9 @@
2
2
 
3
3
  == Description
4
4
 
5
- This gem provides a Mutex that is based on ctiveRecord's database connection.
5
+ This gem provides a Mutex that is based on ActiveRecord's database connection.
6
6
  (At the moment this only works for Mysql.) It can be used to synchronise
7
- different ruby processes via the connected database.
8
-
9
- == Download
10
-
11
- The latest version of the <b>active_record_mutex</b> source archive can be
12
- found at
13
-
14
- * http://www.ping.de/~flori
7
+ ruby processes (also on different hosts) via the connected database.
15
8
 
16
9
  == Installation
17
10
 
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require 'gem_hadar'
4
4
 
5
5
  GemHadar do
6
6
  name 'active_record_mutex'
7
- path_name 'active_record/mutex'
7
+ path_name 'active_record/database_mutex'
8
8
  author 'Florian Frank'
9
9
  email 'flori@ping.de'
10
10
  homepage "http://github.com/flori/#{name}"
@@ -15,6 +15,6 @@ GemHadar do
15
15
  ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock'
16
16
  readme 'README.rdoc'
17
17
 
18
- dependency 'mysql2', '~>0.2.11'
18
+ dependency 'mysql2', '~>0.3.0'
19
19
  dependency 'activerecord'
20
20
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 1.0.0
@@ -1,38 +1,38 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = %q{active_record_mutex}
5
- s.version = "0.0.1"
4
+ s.name = "active_record_mutex"
5
+ s.version = "1.0.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Florian Frank"]
9
- s.date = %q{2011-07-18}
10
- s.description = %q{Mutex that can be used to synchronise ruby processes via an ActiveRecord datababase connection. (Only Mysql is supported at the moment.)}
11
- s.email = %q{flori@ping.de}
12
- s.extra_rdoc_files = ["README.rdoc", "lib/active_record/mutex/version.rb", "lib/active_record/mutex.rb", "lib/active_record_mutex.rb"]
13
- s.files = [".gitignore", "CHANGES", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "active_record_mutex.gemspec", "lib/active_record/mutex.rb", "lib/active_record/mutex/version.rb", "lib/active_record_mutex.rb", "test/mutex_test.rb"]
14
- s.homepage = %q{http://github.com/flori/active_record_mutex}
9
+ s.date = "2012-05-07"
10
+ s.description = "Mutex that can be used to synchronise ruby processes via an ActiveRecord datababase connection. (Only Mysql is supported at the moment.)"
11
+ s.email = "flori@ping.de"
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/active_record_mutex.rb", "lib/active_record/mutex.rb", "lib/active_record/database_mutex.rb", "lib/active_record/database_mutex/version.rb", "lib/active_record/database_mutex/implementation.rb"]
13
+ s.files = [".gitignore", "CHANGES", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "active_record_mutex.gemspec", "lib/active_record/database_mutex.rb", "lib/active_record/database_mutex/implementation.rb", "lib/active_record/database_mutex/version.rb", "lib/active_record/mutex.rb", "lib/active_record_mutex.rb", "test/mutex_test.rb"]
14
+ s.homepage = "http://github.com/flori/active_record_mutex"
15
15
  s.rdoc_options = ["--title", "ActiveRecordMutex - Implementation of a Mutex for Active Record", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
17
- s.rubygems_version = %q{1.7.2}
18
- s.summary = %q{Implementation of a Mutex for Active Record}
17
+ s.rubygems_version = "1.8.24"
18
+ s.summary = "Implementation of a Mutex for Active Record"
19
19
  s.test_files = ["test/mutex_test.rb"]
20
20
 
21
21
  if s.respond_to? :specification_version then
22
22
  s.specification_version = 3
23
23
 
24
24
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
- s.add_development_dependency(%q<gem_hadar>, ["~> 0.0.6"])
26
- s.add_runtime_dependency(%q<mysql2>, ["~> 0.2.11"])
25
+ s.add_development_dependency(%q<gem_hadar>, ["~> 0.0.12"])
26
+ s.add_runtime_dependency(%q<mysql2>, ["~> 0.3.0"])
27
27
  s.add_runtime_dependency(%q<activerecord>, [">= 0"])
28
28
  else
29
- s.add_dependency(%q<gem_hadar>, ["~> 0.0.6"])
30
- s.add_dependency(%q<mysql2>, ["~> 0.2.11"])
29
+ s.add_dependency(%q<gem_hadar>, ["~> 0.0.12"])
30
+ s.add_dependency(%q<mysql2>, ["~> 0.3.0"])
31
31
  s.add_dependency(%q<activerecord>, [">= 0"])
32
32
  end
33
33
  else
34
- s.add_dependency(%q<gem_hadar>, ["~> 0.0.6"])
35
- s.add_dependency(%q<mysql2>, ["~> 0.2.11"])
34
+ s.add_dependency(%q<gem_hadar>, ["~> 0.0.12"])
35
+ s.add_dependency(%q<mysql2>, ["~> 0.3.0"])
36
36
  s.add_dependency(%q<activerecord>, [">= 0"])
37
37
  end
38
38
  end
@@ -0,0 +1,111 @@
1
+ module ActiveRecord
2
+ module DatabaseMutex
3
+ class Implementation
4
+ # Creates a mutex with the name given with the option :name.
5
+ def initialize(opts = {})
6
+ @name = opts[:name] or raise ArgumentError, "mutex requires a :name argument"
7
+ end
8
+
9
+ # Returns the name of this mutex as given as a constructor argument.
10
+ attr_reader :name
11
+
12
+ # Locks the mutex if it isn't already locked via another database
13
+ # connection and yields to the given block. After executing the block's
14
+ # content the mutex is unlocked (only if it was locked by this
15
+ # synchronize method before).
16
+ #
17
+ # If the mutex was already locked by another database connection the
18
+ # method blocks until it could aquire the lock and only then the block's
19
+ # content is executed. If the mutex was already locked by the current database
20
+ # connection then the block's content is run and the the mutex isn't
21
+ # unlocked afterwards.
22
+ #
23
+ # If a value in seconds is passed to the :timeout option the blocking
24
+ # ends after that many seconds and the method returns immediately if the
25
+ # lock couldn't be aquired during that time.
26
+ def synchronize(opts = {})
27
+ locked_before = aquired_lock?
28
+ lock opts
29
+ yield
30
+ rescue ActiveRecord::DatabaseMutex::MutexLocked
31
+ return nil
32
+ ensure
33
+ locked_before or unlock
34
+ end
35
+
36
+ # Locks the mutex and returns true if successful. If the mutex is
37
+ # already locked and the timeout in seconds is given as the :timeout
38
+ # option, this method raises a MutexLocked exception after that many
39
+ # seconds. If the :timeout option wasn't given, this method blocks until
40
+ # the lock could be aquired.
41
+ def lock(opts = {})
42
+ if opts[:timeout]
43
+ lock_with_timeout opts
44
+ else
45
+ begin
46
+ lock_with_timeout :timeout => 1
47
+ rescue MutexLocked
48
+ retry
49
+ end
50
+ end
51
+ end
52
+
53
+ # Unlocks the mutex and returns true if successful. Otherwise this method
54
+ # raises a MutexLocked exception.
55
+ def unlock(*)
56
+ case query("SELECT RELEASE_LOCK(#{ActiveRecord::Base.quote_value(name)})")
57
+ when 1 then true
58
+ when 0, nil then raise MutexUnlockFailed, "unlocking of mutex '#{name}' failed"
59
+ end
60
+ end
61
+
62
+ # Returns true if this mutex is unlocked at the moment.
63
+ def unlocked?
64
+ query("SELECT IS_FREE_LOCK(#{ActiveRecord::Base.quote_value(name)})") == 1
65
+ end
66
+
67
+ # Returns true if this mutex is locked at the moment.
68
+ def locked?
69
+ not unlocked?
70
+ end
71
+
72
+ # Returns true if this mutex is locked by this database connection.
73
+ def aquired_lock?
74
+ query("SELECT CONNECTION_ID() = IS_USED_LOCK(#{ActiveRecord::Base.quote_value(name)})") == 1
75
+ end
76
+
77
+ # Returns true if this mutex is not locked by this database connection.
78
+ def not_aquired_lock?
79
+ not aquired_lock?
80
+ end
81
+
82
+ # Returns a string representation of this DatabaseMutex instance.
83
+ def to_s
84
+ "#<#{self.class} #{name}>"
85
+ end
86
+
87
+ alias inspect to_s
88
+
89
+ private
90
+
91
+ def lock_with_timeout(opts = {})
92
+ timeout = opts[:timeout] || 1
93
+ case query("SELECT GET_LOCK(#{ActiveRecord::Base.quote_value(name)}, #{timeout})")
94
+ when 1 then true
95
+ when 0 then raise MutexLocked, "mutex '#{name}' is already locked"
96
+ end
97
+ end
98
+
99
+ def query(sql)
100
+ if result = ActiveRecord::Base.connection.execute(sql)
101
+ result = result.first.first.to_i
102
+ $DEBUG and warn %{query("#{sql}") = #{result}}
103
+ end
104
+ result
105
+ rescue ActiveRecord::StatementInvalid
106
+ nil
107
+ end
108
+ end
109
+ end
110
+ end
111
+
@@ -1,6 +1,6 @@
1
- module ActiveRecord::Mutex
2
- # ActiveRecord::Mutex version
3
- VERSION = '0.0.1'
1
+ module ActiveRecord::DatabaseMutex
2
+ # ActiveRecord::DatabaseMutex version
3
+ VERSION = '1.0.0'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -0,0 +1,42 @@
1
+ require 'active_record'
2
+ require 'active_record/database_mutex/version'
3
+ require 'active_record/database_mutex/implementation'
4
+
5
+ module ActiveRecord
6
+ # This module is mixed into ActiveRecord::Base to provide the mutex methods
7
+ # that return a mutex for a particular ActiveRecord::Base subclass/instance.
8
+ module DatabaseMutex
9
+ # This is the base exception of all mutex exceptions.
10
+ class MutexError < ActiveRecordError; end
11
+
12
+ # This exception is raised if a mutex of the given name isn't locked at the
13
+ # moment and unlock was called.
14
+ class MutexUnlockFailed < MutexError; end
15
+
16
+ # This exception is raised if a mutex of the given name is locked at the
17
+ # moment and lock was called again.
18
+ class MutexLocked < MutexError; end
19
+
20
+ def self.included(modul)
21
+ modul.instance_eval do
22
+ extend ClassMethods
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ # Returns a mutex instance for this ActiveRecord subclass.
28
+ def mutex
29
+ @mutex ||= Implementation.new(:name => name)
30
+ end
31
+ end
32
+
33
+ # Returns a mutex instance for this ActiveRecord instance.
34
+ def mutex
35
+ @mutex ||= Implementation.new(:name => self.class.name)
36
+ end
37
+ end
38
+ end
39
+
40
+ ActiveRecord::Base.class_eval do
41
+ include ActiveRecord::DatabaseMutex
42
+ end
@@ -1,148 +1 @@
1
- require 'active_record'
2
- require 'active_record/mutex/version'
3
-
4
- module ActiveRecord
5
- # This module is mixed into ActiveRecord::Base to provide the mutex methods
6
- # that return a mutex for a particular ActiveRecord::Base subclass/instance.
7
- module Mutex
8
- # This is the base exception of all mutex exceptions.
9
- class MutexError < ActiveRecordError; end
10
-
11
- # This exception is raised if a mutex of the given name isn't locked at the
12
- # moment and unlock was called.
13
- class MutexUnlockFailed < MutexError; end
14
-
15
- # This exception is raised if a mutex of the given name is locked at the
16
- # moment and lock was called again.
17
- class MutexLocked < MutexError; end
18
-
19
- def self.included(modul)
20
- modul.instance_eval do
21
- extend ClassMethods
22
- end
23
- end
24
-
25
- module ClassMethods
26
- # Returns a mutex instance for this ActiveRecord subclass.
27
- def mutex
28
- @mutex ||= Mutex.new(:name => name)
29
- end
30
- end
31
-
32
- # Returns a mutex instance for this ActiveRecord instance.
33
- def mutex
34
- @mutex ||= Mutex.new(:name => self.class.name)
35
- end
36
-
37
- class Mutex
38
- # Creates a mutex with the name given with the option :name.
39
- def initialize(opts = {})
40
- @name = opts[:name] or raise ArgumentError, "Mutex requires a :name argument"
41
- end
42
-
43
- # Returns the name of this mutex as given as a constructor argument.
44
- attr_reader :name
45
-
46
- # Locks the mutex if it isn't already locked via another database
47
- # connection and yields to the given block. After executing the block's
48
- # content the mutex is unlocked (only if it was locked by this
49
- # synchronize method before).
50
- #
51
- # If the mutex was already locked by another database connection the
52
- # method blocks until it could aquire the lock and only then the block's
53
- # content is executed. If the mutex was already locked by the current database
54
- # connection then the block's content is run and the the mutex isn't
55
- # unlocked afterwards.
56
- #
57
- # If a value in seconds is passed to the :timeout option the blocking
58
- # ends after that many seconds and the method returns immediately if the
59
- # lock couldn't be aquired during that time.
60
- def synchronize(opts = {})
61
- locked_before = aquired_lock?
62
- lock opts
63
- yield
64
- rescue ActiveRecord::Mutex::MutexLocked
65
- return nil
66
- ensure
67
- locked_before or unlock
68
- end
69
-
70
- # Locks the mutex and returns true if successful. If the mutex is
71
- # already locked and the timeout in seconds is given as the :timeout
72
- # option, this method raises a MutexLocked exception after that many
73
- # seconds. If the :timeout option wasn't given, this method blocks until
74
- # the lock could be aquired.
75
- def lock(opts = {})
76
- if opts[:timeout]
77
- lock_with_timeout opts
78
- else
79
- begin
80
- lock_with_timeout :timeout => 1
81
- rescue MutexLocked
82
- retry
83
- end
84
- end
85
- end
86
-
87
- # Unlocks the mutex and returns true if successful. Otherwise this method
88
- # raises a MutexLocked exception.
89
- def unlock(*)
90
- case query("SELECT RELEASE_LOCK(#{ActiveRecord::Base.quote_value(name)})")
91
- when 1 then true
92
- when 0, nil then raise MutexUnlockFailed, "unlocking of mutex '#{name}' failed"
93
- end
94
- end
95
-
96
- # Returns true if this mutex is unlocked at the moment.
97
- def unlocked?
98
- query("SELECT IS_FREE_LOCK(#{ActiveRecord::Base.quote_value(name)})") == 1
99
- end
100
-
101
- # Returns true if this mutex is locked at the moment.
102
- def locked?
103
- not unlocked?
104
- end
105
-
106
- # Returns true if this mutex is locked by this database connection.
107
- def aquired_lock?
108
- query("SELECT CONNECTION_ID() = IS_USED_LOCK(#{ActiveRecord::Base.quote_value(name)})") == 1
109
- end
110
-
111
- # Returns true if this mutex is not locked by this database connection.
112
- def not_aquired_lock?
113
- not aquired_lock?
114
- end
115
-
116
- # Returns a string representation of this Mutex instance.
117
- def to_s
118
- "#<#{self.class} #{name}>"
119
- end
120
-
121
- alias inspect to_s
122
-
123
- private
124
-
125
- def lock_with_timeout(opts = {})
126
- timeout = opts[:timeout] || 1
127
- case query("SELECT GET_LOCK(#{ActiveRecord::Base.quote_value(name)}, #{timeout})")
128
- when 1 then true
129
- when 0 then raise MutexLocked, "mutex '#{name}' is already locked"
130
- end
131
- end
132
-
133
- def query(sql)
134
- if result = ActiveRecord::Base.connection.execute(sql)
135
- result = result.first.first.to_i
136
- $DEBUG and warn %{query("#{sql}") = #{result}}
137
- end
138
- result
139
- rescue ActiveRecord::StatementInvalid
140
- nil
141
- end
142
- end
143
- end
144
- end
145
-
146
- ActiveRecord::Base.class_eval do
147
- include ActiveRecord::Mutex
148
- end
1
+ require 'active_record/database_mutex'
@@ -1 +1 @@
1
- require 'active_record/mutex'
1
+ require 'active_record/database_mutex'
data/test/mutex_test.rb CHANGED
@@ -3,16 +3,19 @@ require 'rubygems'
3
3
 
4
4
  require 'active_record'
5
5
  $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
- require 'active_record/mutex'
6
+ require 'active_record/database_mutex'
7
7
 
8
8
  ActiveRecord::Base.establish_connection(
9
9
  :adapter => "mysql2",
10
10
  :database => ENV['DATABASE'] || "test",
11
11
  :username => ENV['USER'],
12
- :password => ENV['PASSWORD']
12
+ :password => ENV['PASSWORD'],
13
+ :host => ENV['HOST'] || 'localhost'
13
14
  )
14
15
 
15
16
  class MutexTest < Test::Unit::TestCase
17
+ include ActiveRecord::DatabaseMutex
18
+
16
19
  class Foo < ActiveRecord::Base; end
17
20
 
18
21
  def setup
@@ -29,20 +32,20 @@ class MutexTest < Test::Unit::TestCase
29
32
 
30
33
  def test_exported_methods
31
34
  mutex = Foo.mutex
32
- assert_kind_of ActiveRecord::Mutex::Mutex, mutex
35
+ assert_kind_of ActiveRecord::DatabaseMutex::Implementation, mutex
33
36
  assert_equal mutex.name, Foo.name
34
37
  mutex = Foo.new.mutex
35
- assert_kind_of ActiveRecord::Mutex::Mutex, mutex
38
+ assert_kind_of ActiveRecord::DatabaseMutex::Implementation, mutex
36
39
  assert_equal mutex.name, Foo.name
37
40
  end
38
41
 
39
42
  def test_create
40
- mutex = ActiveRecord::Mutex::Mutex.new(:name => 'Create')
43
+ mutex = Implementation.new(:name => 'Create')
41
44
  assert_equal 'Create', mutex.name
42
45
  end
43
46
 
44
47
  def test_lock
45
- mutex = ActiveRecord::Mutex::Mutex.new(:name => 'Lock')
48
+ mutex = Implementation.new(:name => 'Lock')
46
49
  assert mutex.unlocked?
47
50
  assert mutex.lock
48
51
  assert mutex.locked?
@@ -51,18 +54,18 @@ class MutexTest < Test::Unit::TestCase
51
54
  end
52
55
 
53
56
  def test_unlock
54
- mutex = ActiveRecord::Mutex::Mutex.new(:name => 'Unlock')
55
- assert_raises(ActiveRecord::Mutex::MutexUnlockFailed) { mutex.unlock }
57
+ mutex = Implementation.new(:name => 'Unlock')
58
+ assert_raises(ActiveRecord::DatabaseMutex::MutexUnlockFailed) { mutex.unlock }
56
59
  assert mutex.lock
57
60
  assert mutex.locked?
58
61
  assert mutex.aquired_lock?
59
62
  assert mutex.unlock
60
63
  assert mutex.unlocked?
61
- assert_raises(ActiveRecord::Mutex::MutexUnlockFailed) { mutex.unlock }
64
+ assert_raises(ActiveRecord::DatabaseMutex::MutexUnlockFailed) { mutex.unlock }
62
65
  end
63
66
 
64
67
  def test_synchronize
65
- mutex = ActiveRecord::Mutex::Mutex.new(:name => 'Sync1')
68
+ mutex = Implementation.new(:name => 'Sync1')
66
69
  assert mutex.unlocked?
67
70
  mutex.synchronize do
68
71
  assert mutex.locked?
@@ -71,7 +74,7 @@ class MutexTest < Test::Unit::TestCase
71
74
  end
72
75
 
73
76
  def test_synchronize_exception
74
- mutex = ActiveRecord::Mutex::Mutex.new(:name => 'Sync2')
77
+ mutex = Implementation.new(:name => 'Sync2')
75
78
  exception = Class.new StandardError
76
79
  begin
77
80
  assert mutex.unlocked?
@@ -87,7 +90,7 @@ class MutexTest < Test::Unit::TestCase
87
90
  end
88
91
 
89
92
  def test_synchronize_nested
90
- mutex = ActiveRecord::Mutex::Mutex.new(:name => 'Sync3')
93
+ mutex = Implementation.new(:name => 'Sync3')
91
94
  assert mutex.unlocked?
92
95
  mutex.synchronize do
93
96
  assert mutex.locked?
metadata CHANGED
@@ -1,80 +1,83 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: active_record_mutex
3
- version: !ruby/object:Gem::Version
4
- hash: 29
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Florian Frank
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-07-18 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-05-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: gem_hadar
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 19
29
- segments:
30
- - 0
31
- - 0
32
- - 6
33
- version: 0.0.6
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.12
34
22
  type: :development
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: mysql2
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.12
30
+ - !ruby/object:Gem::Dependency
31
+ name: mysql2
32
+ requirement: !ruby/object:Gem::Requirement
40
33
  none: false
41
- requirements:
34
+ requirements:
42
35
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 1
45
- segments:
46
- - 0
47
- - 2
48
- - 11
49
- version: 0.2.11
36
+ - !ruby/object:Gem::Version
37
+ version: 0.3.0
50
38
  type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: activerecord
54
39
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
56
41
  none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 0
63
- version: "0"
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.3.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
64
54
  type: :runtime
65
- version_requirements: *id003
66
- description: Mutex that can be used to synchronise ruby processes via an ActiveRecord datababase connection. (Only Mysql is supported at the moment.)
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Mutex that can be used to synchronise ruby processes via an ActiveRecord
63
+ datababase connection. (Only Mysql is supported at the moment.)
67
64
  email: flori@ping.de
68
65
  executables: []
69
-
70
66
  extensions: []
71
-
72
- extra_rdoc_files:
67
+ extra_rdoc_files:
73
68
  - README.rdoc
74
- - lib/active_record/mutex/version.rb
75
- - lib/active_record/mutex.rb
76
- - lib/active_record_mutex.rb
77
- files:
69
+ - !binary |-
70
+ bGliL2FjdGl2ZV9yZWNvcmRfbXV0ZXgucmI=
71
+ - !binary |-
72
+ bGliL2FjdGl2ZV9yZWNvcmQvbXV0ZXgucmI=
73
+ - !binary |-
74
+ bGliL2FjdGl2ZV9yZWNvcmQvZGF0YWJhc2VfbXV0ZXgucmI=
75
+ - !binary |-
76
+ bGliL2FjdGl2ZV9yZWNvcmQvZGF0YWJhc2VfbXV0ZXgvdmVyc2lvbi5yYg==
77
+ - !binary |-
78
+ bGliL2FjdGl2ZV9yZWNvcmQvZGF0YWJhc2VfbXV0ZXgvaW1wbGVtZW50YXRp
79
+ b24ucmI=
80
+ files:
78
81
  - .gitignore
79
82
  - CHANGES
80
83
  - Gemfile
@@ -82,45 +85,43 @@ files:
82
85
  - Rakefile
83
86
  - VERSION
84
87
  - active_record_mutex.gemspec
88
+ - lib/active_record/database_mutex.rb
89
+ - lib/active_record/database_mutex/implementation.rb
90
+ - lib/active_record/database_mutex/version.rb
85
91
  - lib/active_record/mutex.rb
86
- - lib/active_record/mutex/version.rb
87
92
  - lib/active_record_mutex.rb
88
93
  - test/mutex_test.rb
89
94
  homepage: http://github.com/flori/active_record_mutex
90
95
  licenses: []
91
-
92
96
  post_install_message:
93
- rdoc_options:
97
+ rdoc_options:
94
98
  - --title
95
99
  - ActiveRecordMutex - Implementation of a Mutex for Active Record
96
100
  - --main
97
101
  - README.rdoc
98
- require_paths:
102
+ require_paths:
99
103
  - lib
100
- required_ruby_version: !ruby/object:Gem::Requirement
104
+ required_ruby_version: !ruby/object:Gem::Requirement
101
105
  none: false
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- hash: 3
106
- segments:
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ segments:
107
111
  - 0
108
- version: "0"
109
- required_rubygems_version: !ruby/object:Gem::Requirement
112
+ hash: 3312352777987471418
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
114
  none: false
111
- requirements:
112
- - - ">="
113
- - !ruby/object:Gem::Version
114
- hash: 3
115
- segments:
116
- - 0
117
- version: "0"
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
118
119
  requirements: []
119
-
120
120
  rubyforge_project:
121
- rubygems_version: 1.7.2
121
+ rubygems_version: 1.8.24
122
122
  signing_key:
123
123
  specification_version: 3
124
124
  summary: Implementation of a Mutex for Active Record
125
- test_files:
126
- - test/mutex_test.rb
125
+ test_files:
126
+ - !binary |-
127
+ dGVzdC9tdXRleF90ZXN0LnJi