lock_method 0.2.0 → 0.2.1
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/README.rdoc +6 -4
- data/lib/lock_method/default_storage_client.rb +6 -6
- data/lib/lock_method/lock.rb +8 -6
- data/lib/lock_method/version.rb +1 -1
- data/lib/lock_method.rb +9 -2
- data/lock_method.gemspec +2 -1
- data/test/shared_tests.rb +11 -0
- metadata +73 -70
data/README.rdoc
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
It's like <tt>alias_method</tt>, but it's <tt>lock_method</tt>!
|
4
4
|
|
5
|
+
Lets you lock a method so that only one process can call it at a time. Defaults to using lockfiles on the local file system, but can be configured to store the locks in Memcached or Redis, allowing the method locks to hold over multiple hosts.
|
6
|
+
|
7
|
+
== Real-world usage
|
8
|
+
|
9
|
+
In production use at {carbon.brighterplanet.com}[http://carbon.brighterplanet.com] and {data.brighterplanet.com}[http://data.brighterplanet.com].
|
10
|
+
|
5
11
|
== Example
|
6
12
|
|
7
13
|
require 'lock_method'
|
@@ -28,10 +34,6 @@ Just in case, you can clear them
|
|
28
34
|
|
29
35
|
my_blog.clear_method_lock :get_latest_entries
|
30
36
|
|
31
|
-
== Real-world usage
|
32
|
-
|
33
|
-
In production use at {carbon.brighterplanet.com}[http://carbon.brighterplanet.com], the Brighter Planet emission estimate web service.
|
34
|
-
|
35
37
|
== Pays attention to method arguments
|
36
38
|
|
37
39
|
If you lock Foo.bar(*args), calling Foo.bar(:baz) will not lock out Foo.bar(:zoo).
|
@@ -11,10 +11,10 @@ module LockMethod
|
|
11
11
|
attr_reader :created_at
|
12
12
|
attr_reader :ttl
|
13
13
|
attr_reader :v
|
14
|
-
def initialize(
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
def initialize(ttl, v)
|
15
|
+
@created_at = ::Time.now.to_f
|
16
|
+
@ttl = ttl
|
17
|
+
@v = v
|
18
18
|
end
|
19
19
|
def expired?
|
20
20
|
ttl.to_i > 0 and (::Time.now.to_f - created_at.to_f) > ttl.to_i
|
@@ -29,10 +29,10 @@ module LockMethod
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def set(k, v, ttl)
|
32
|
-
entry = Entry.new
|
32
|
+
entry = Entry.new ttl, v
|
33
33
|
semaphore.synchronize do
|
34
34
|
::FileUtils.mkdir_p dir unless ::File.directory? dir
|
35
|
-
::File.open(path(k), ::File::RDWR|::File::CREAT) do |f|
|
35
|
+
::File.open(path(k), ::File::RDWR|::File::CREAT, :external_encoding => 'ASCII-8BIT') do |f|
|
36
36
|
f.flock ::File::LOCK_EX
|
37
37
|
f.write ::Marshal.dump(entry)
|
38
38
|
end
|
data/lib/lock_method/lock.rb
CHANGED
@@ -26,15 +26,17 @@ module LockMethod
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def initialize(attrs = {})
|
30
|
-
attrs.each do |k, v|
|
31
|
-
instance_variable_set "@#{k}", v
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
29
|
attr_reader :obj
|
36
30
|
attr_reader :method_id
|
37
31
|
attr_reader :args
|
32
|
+
|
33
|
+
def initialize(obj, method_id, options = {})
|
34
|
+
@obj = obj
|
35
|
+
@method_id = method_id
|
36
|
+
options = options.symbolize_keys
|
37
|
+
@ttl = options[:ttl]
|
38
|
+
@args = options[:args]
|
39
|
+
end
|
38
40
|
|
39
41
|
def method_signature
|
40
42
|
@method_signature ||= Lock.method_signature(obj, method_id)
|
data/lib/lock_method/version.rb
CHANGED
data/lib/lock_method.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/version'
|
3
|
+
if ::ActiveSupport::VERSION::MAJOR >= 3
|
4
|
+
require 'active_support/core_ext'
|
5
|
+
end
|
6
|
+
|
1
7
|
require 'lock_method/version'
|
8
|
+
|
2
9
|
# See the README.rdoc for more info!
|
3
10
|
module LockMethod
|
4
11
|
autoload :Config, 'lock_method/config'
|
@@ -20,7 +27,7 @@ module LockMethod
|
|
20
27
|
# Example:
|
21
28
|
# my_blog.clear_method_lock :get_latest_entries
|
22
29
|
def clear_method_lock(method_id)
|
23
|
-
lock = ::LockMethod::Lock.new
|
30
|
+
lock = ::LockMethod::Lock.new self, method_id
|
24
31
|
lock.delete
|
25
32
|
end
|
26
33
|
end
|
@@ -46,7 +53,7 @@ module LockMethod
|
|
46
53
|
original_method_id = "_unlocked_#{method_id}"
|
47
54
|
alias_method original_method_id, method_id
|
48
55
|
define_method method_id do |*args|
|
49
|
-
lock = ::LockMethod::Lock.new
|
56
|
+
lock = ::LockMethod::Lock.new self, method_id, :ttl => ttl, :args => args
|
50
57
|
lock.call_and_lock original_method_id, *args
|
51
58
|
end
|
52
59
|
end
|
data/lock_method.gemspec
CHANGED
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
-
s.
|
21
|
+
s.add_runtime_dependency 'cache', '>=0.2.1'
|
22
|
+
s.add_runtime_dependency 'activesupport'
|
22
23
|
s.add_development_dependency 'test-unit'
|
23
24
|
s.add_development_dependency 'memcached'
|
24
25
|
s.add_development_dependency 'redis'
|
data/test/shared_tests.rb
CHANGED
@@ -228,4 +228,15 @@ module SharedTests
|
|
228
228
|
Blog2.work_really_hard_on :foo
|
229
229
|
end
|
230
230
|
end
|
231
|
+
|
232
|
+
def test_13_no_encoding_issues
|
233
|
+
old_int = Encoding.default_internal
|
234
|
+
old_ext = Encoding.default_external
|
235
|
+
Encoding.default_internal = 'UTF-8'
|
236
|
+
Encoding.default_external = 'UTF-8'
|
237
|
+
assert_equal ["hello from my_blog"], new_instance_of_my_blog.get_latest_entries
|
238
|
+
ensure
|
239
|
+
Encoding.default_internal = old_int
|
240
|
+
Encoding.default_external = old_ext
|
241
|
+
end
|
231
242
|
end
|
metadata
CHANGED
@@ -1,83 +1,89 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: lock_method
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Seamus Abshere
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-12-06 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: cache
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2161845800 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
24
21
|
version: 0.2.1
|
25
22
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: test-unit
|
29
23
|
prerelease: false
|
30
|
-
|
24
|
+
version_requirements: *2161845800
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
requirement: &2161843720 !ruby/object:Gem::Requirement
|
31
28
|
none: false
|
32
|
-
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2161843720
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: test-unit
|
38
|
+
requirement: &2161841860 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
36
44
|
type: :development
|
37
|
-
version_requirements: *id002
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: memcached
|
40
45
|
prerelease: false
|
41
|
-
|
46
|
+
version_requirements: *2161841860
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: memcached
|
49
|
+
requirement: &2161830720 !ruby/object:Gem::Requirement
|
42
50
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version:
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
47
55
|
type: :development
|
48
|
-
version_requirements: *id003
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: redis
|
51
56
|
prerelease: false
|
52
|
-
|
57
|
+
version_requirements: *2161830720
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: redis
|
60
|
+
requirement: &2161830100 !ruby/object:Gem::Requirement
|
53
61
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version:
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
58
66
|
type: :development
|
59
|
-
version_requirements: *id004
|
60
|
-
- !ruby/object:Gem::Dependency
|
61
|
-
name: ruby-debug19
|
62
67
|
prerelease: false
|
63
|
-
|
68
|
+
version_requirements: *2161830100
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ruby-debug19
|
71
|
+
requirement: &2161829520 !ruby/object:Gem::Requirement
|
64
72
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version:
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
69
77
|
type: :development
|
70
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *2161829520
|
71
80
|
description: Like alias_method, but it's lock_method!
|
72
|
-
email:
|
81
|
+
email:
|
73
82
|
- seamus@abshere.net
|
74
83
|
executables: []
|
75
|
-
|
76
84
|
extensions: []
|
77
|
-
|
78
85
|
extra_rdoc_files: []
|
79
|
-
|
80
|
-
files:
|
86
|
+
files:
|
81
87
|
- .gitignore
|
82
88
|
- Gemfile
|
83
89
|
- README.rdoc
|
@@ -93,35 +99,32 @@ files:
|
|
93
99
|
- test/test_default_storage.rb
|
94
100
|
- test/test_memcached_storage.rb
|
95
101
|
- test/test_redis_storage.rb
|
96
|
-
has_rdoc: true
|
97
102
|
homepage: https://github.com/seamusabshere/lock_method
|
98
103
|
licenses: []
|
99
|
-
|
100
104
|
post_install_message:
|
101
105
|
rdoc_options: []
|
102
|
-
|
103
|
-
require_paths:
|
106
|
+
require_paths:
|
104
107
|
- lib
|
105
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
109
|
none: false
|
107
|
-
requirements:
|
108
|
-
- -
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ! '>='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
115
|
none: false
|
113
|
-
requirements:
|
114
|
-
- -
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version:
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
117
120
|
requirements: []
|
118
|
-
|
119
121
|
rubyforge_project: lock_method
|
120
|
-
rubygems_version: 1.
|
122
|
+
rubygems_version: 1.8.10
|
121
123
|
signing_key:
|
122
124
|
specification_version: 3
|
123
|
-
summary: Lets you lock methods (to memcached, redis, etc.) as though you had a lockfile
|
124
|
-
|
125
|
+
summary: Lets you lock methods (to memcached, redis, etc.) as though you had a lockfile
|
126
|
+
for each one
|
127
|
+
test_files:
|
125
128
|
- test/helper.rb
|
126
129
|
- test/shared_tests.rb
|
127
130
|
- test/test_default_storage.rb
|