monogamy 0.0.1 → 0.0.2

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZGZiODBiNGQyMWYzYzE4NTM2M2Q2MmM3NjM0MmNiOTNmODM0MWQyOA==
5
+ data.tar.gz: !binary |-
6
+ MDdlNzkxOGU5MTc5MDg0MzBkNjRhNGM0OGE5NmRmN2E4ODM0OTQ5Yw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ N2NjN2JmY2JlNTgzMTk5N2YxZDBiYThmYTlmNDM0NDdkODg3MTcyZTMyNzA5
10
+ Yzc5MWRkMDViZDc0NTEwYmZhZmUwYzcyMTJhYzZhNTk3NzQyMWQxOWU1ZjI4
11
+ ZmFjYTZjNzRmMTYzYjJhMjU4Y2FlMjJlNWZiZWNmZjYzNmMyOGI=
12
+ data.tar.gz: !binary |-
13
+ NjdlOTIyOWYzM2UxOGJlZGM3YWI1NzU0MzUzODhiZjdlNDM3ZjMyZmVkOTVh
14
+ ZWQwNzc1MWIzYTI1ZWIxODZlMTlkMTEwYzcyYWRiY2FhY2EwNzg1NmUxZDY5
15
+ MjBjZGI3YWY5ZTljZDYzNGJlNTBkYWZlZDg1N2MyNTdlZTk5ZGE=
@@ -1,11 +1,14 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 1.8.7
5
4
  - 1.9.3
5
+ - 2.0.0
6
+
7
+ gemfile:
8
+ - ci/Gemfile.rails-4.0.x
9
+ - ci/Gemfile.rails-3.2.x
6
10
 
7
11
  env:
8
- - DB=sqlite
9
12
  - DB=mysql
10
13
  - DB=pg
11
14
 
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
- # Monogamy [![Build Status](https://api.travis-ci.org/mceachen/monogamy.png?branch=master)](https://travis-ci.org/mceachen/monogamy)
1
+ # Monogamy
2
2
 
3
- Adds table-level locking to ActiveRecord 3.x. MySQL, PostgreSQL, and SQLite are supported.
3
+ Adds table-level locking to ActiveRecord 3.2 and 4.0. MySQL and PostgreSQL are supported.
4
+
5
+ [![Build Status](https://api.travis-ci.org/mceachen/monogamy.png?branch=master)](https://travis-ci.org/mceachen/monogamy)
6
+ [![Gem Version](https://badge.fury.io/rb/monogamy.png)](http://rubygems.org/gems/monogamy)
7
+ [![Dependency Status](https://gemnasium.com/mceachen/monogamy.png)](https://gemnasium.com/mceachen/monogamy)
4
8
 
5
9
  ## Usage
6
10
 
@@ -13,6 +17,9 @@ end
13
17
  While your code is inside the block, it will have exclusive read and write access to the model's
14
18
  table.
15
19
 
20
+ A transaction will be opened and closed for you automatically during your block's execution.
21
+ There's no need to wrap your call to ```with_table_lock``` with a ```transaction do```.
22
+
16
23
  If your block touches other tables, and you use table-level locking on those tables as well,
17
24
  read up about [deadlocks](http://en.wikipedia.org/wiki/Deadlock). **You have been warned.**
18
25
 
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '..'
3
+
4
+ gem 'activerecord', '~> 3.2.0'
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '..'
3
+
4
+ gem 'activerecord', '~> 4.0.0'
@@ -1,3 +1,3 @@
1
1
  module Monogamy
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -5,18 +5,15 @@
5
5
 
6
6
  require 'monogamy/mysql'
7
7
  require 'monogamy/postgresql'
8
- require 'monogamy/sqlite'
9
8
 
10
9
  module Monogamy
11
10
  module WithTableLock
12
11
  def with_table_lock(&block)
13
12
  adapter = case (connection.adapter_name.downcase)
14
- when "postgresql"
13
+ when 'postgresql', 'empostgresql', 'postgis'
15
14
  Monogamy::PostgreSQL
16
- when "mysql", "mysql2"
15
+ when 'mysql', 'mysql2'
17
16
  Monogamy::MySQL
18
- when "sqlite"
19
- Monogamy::SQLite
20
17
  else
21
18
  raise NotImplementedError, "Support for #{connection.adapter_name} has not been written"
22
19
  end
@@ -6,24 +6,23 @@ require 'monogamy/version'
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "monogamy"
8
8
  gem.version = Monogamy::VERSION
9
- gem.authors = ["Matthew McEachen"]
10
- gem.email = ["matthew+github@mceachen.org"]
9
+ gem.authors = ['Matthew McEachen']
10
+ gem.email = ['matthew+github@mceachen.org']
11
11
  gem.description = %q{Add table-level database locking to ActiveRecord}
12
12
  gem.summary = gem.description
13
- gem.homepage = ""
13
+ gem.homepage = 'https://github.com/mceachen/monogamy'
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
17
  gem.test_files = gem.files.grep(%r{^test/})
18
18
  gem.require_paths = %w(lib)
19
19
 
20
- gem.add_runtime_dependency 'activerecord', '>= 3.0.0'
20
+ gem.add_runtime_dependency 'activerecord', '>= 3.2'
21
21
 
22
22
  gem.add_development_dependency 'rake'
23
23
  gem.add_development_dependency 'yard'
24
24
  gem.add_development_dependency 'minitest'
25
25
  gem.add_development_dependency 'mysql2'
26
26
  gem.add_development_dependency 'pg'
27
- gem.add_development_dependency 'sqlite3'
28
27
  gem.add_development_dependency 'database_cleaner'
29
28
  end
@@ -1,7 +1,3 @@
1
- sqlite:
2
- adapter: <%= "jdbc" if defined? JRUBY_VERSION %>sqlite3
3
- database: monogamy.sqlite3.db
4
- pool: 50
5
1
  pg:
6
2
  adapter: postgresql
7
3
  username: postgres
@@ -13,4 +9,4 @@ mysql:
13
9
  host: localhost
14
10
  username: root
15
11
  database: monogamy_test
16
- pool: 50
12
+ pool: 50
@@ -9,17 +9,14 @@ ActiveRecord::Base.establish_connection(ENV["DB"] || "sqlite")
9
9
  ActiveRecord::Migration.verbose = false
10
10
 
11
11
  require 'test_models'
12
-
13
- Tag.new # < make sure class has loaded
14
-
15
12
  require 'minitest/autorun'
16
13
 
17
14
  DatabaseCleaner.strategy = :deletion
18
15
  class MiniTest::Spec
19
- before :each do
16
+ before do
20
17
  DatabaseCleaner.start
21
18
  end
22
- after :each do
19
+ after do
23
20
  DatabaseCleaner.clean
24
21
  end
25
22
  end
@@ -16,15 +16,15 @@ describe "Monogamy" do
16
16
  Tag.connection.reconnect!
17
17
  if with_table_lock
18
18
  Tag.with_table_lock do
19
- Tag.find_or_create_by_name(run_at.to_s)
19
+ Tag.where(name: run_at.to_s).first_or_create!
20
20
  end
21
21
  else
22
- Tag.find_or_create_by_name(run_at.to_s)
22
+ Tag.where(name: run_at.to_s).first_or_create!
23
23
  end
24
24
  end
25
25
 
26
26
  def run_workers(with_table_lock)
27
- start_time = Time.now.to_i + 2
27
+ start_time = Time.now.to_i + 3
28
28
  threads = @workers.times.collect do
29
29
  Thread.new do
30
30
  begin
@@ -40,6 +40,7 @@ describe "Monogamy" do
40
40
  end
41
41
 
42
42
  before :each do
43
+ Tag.connection.reconnect!
43
44
  @iterations = 5
44
45
  @workers = 7
45
46
  end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monogamy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Matthew McEachen
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-07 00:00:00.000000000 Z
11
+ date: 2013-12-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activerecord
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
- version: 3.0.0
19
+ version: '3.2'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
29
- version: 3.0.0
26
+ version: '3.2'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: yard
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: minitest
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: mysql2
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: pg
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,23 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- - !ruby/object:Gem::Dependency
111
- name: sqlite3
112
- requirement: !ruby/object:Gem::Requirement
113
- none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
93
  requirements:
123
94
  - - ! '>='
124
95
  - !ruby/object:Gem::Version
@@ -126,7 +97,6 @@ dependencies:
126
97
  - !ruby/object:Gem::Dependency
127
98
  name: database_cleaner
128
99
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
100
  requirements:
131
101
  - - ! '>='
132
102
  - !ruby/object:Gem::Version
@@ -134,7 +104,6 @@ dependencies:
134
104
  type: :development
135
105
  prerelease: false
136
106
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
107
  requirements:
139
108
  - - ! '>='
140
109
  - !ruby/object:Gem::Version
@@ -152,10 +121,11 @@ files:
152
121
  - LICENSE.txt
153
122
  - README.md
154
123
  - Rakefile
124
+ - ci/Gemfile.rails-3.2.x
125
+ - ci/Gemfile.rails-4.0.x
155
126
  - lib/monogamy.rb
156
127
  - lib/monogamy/mysql.rb
157
128
  - lib/monogamy/postgresql.rb
158
- - lib/monogamy/sqlite.rb
159
129
  - lib/monogamy/version.rb
160
130
  - lib/monogamy/with_table_lock.rb
161
131
  - monogamy.gemspec
@@ -163,35 +133,28 @@ files:
163
133
  - test/minitest_helper.rb
164
134
  - test/monogamy_test.rb
165
135
  - test/test_models.rb
166
- homepage: ''
136
+ homepage: https://github.com/mceachen/monogamy
167
137
  licenses: []
138
+ metadata: {}
168
139
  post_install_message:
169
140
  rdoc_options: []
170
141
  require_paths:
171
142
  - lib
172
143
  required_ruby_version: !ruby/object:Gem::Requirement
173
- none: false
174
144
  requirements:
175
145
  - - ! '>='
176
146
  - !ruby/object:Gem::Version
177
147
  version: '0'
178
- segments:
179
- - 0
180
- hash: -3951791607027416484
181
148
  required_rubygems_version: !ruby/object:Gem::Requirement
182
- none: false
183
149
  requirements:
184
150
  - - ! '>='
185
151
  - !ruby/object:Gem::Version
186
152
  version: '0'
187
- segments:
188
- - 0
189
- hash: -3951791607027416484
190
153
  requirements: []
191
154
  rubyforge_project:
192
- rubygems_version: 1.8.23
155
+ rubygems_version: 2.1.10
193
156
  signing_key:
194
- specification_version: 3
157
+ specification_version: 4
195
158
  summary: Add table-level database locking to ActiveRecord
196
159
  test_files:
197
160
  - test/database.yml
@@ -1,33 +0,0 @@
1
- module Monogamy
2
- module SQLite
3
- # See http://sqlite.org/lang_transaction.html
4
- def self.with_table_lock(connection, quoted_table_name, &block)
5
- if connection.open_transactions > 0
6
- raise NotImplementedError, "Support for nested transactions within sqlite has not been written"
7
- end
8
-
9
- begin
10
- connection.execute("BEGIN EXCLUSIVE TRANSACTION")
11
- rescue Exception => e
12
- if e.message.include? "SQLite3::BusyException" # < Rails wraps BusyException in the message (!!!)
13
- sleep 0.2
14
- retry
15
- else
16
- raise e
17
- end
18
- end
19
-
20
- begin
21
- connection.increment_open_transactions
22
- yield
23
- connection.execute("COMMIT TRANSACTION")
24
- rescue Exception => e
25
- puts e
26
- puts e.backtrace.join("\n")
27
- connection.execute("ROLLBACK TRANSACTION")
28
- ensure
29
- connection.decrement_open_transactions
30
- end
31
- end
32
- end
33
- end