lock_method 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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(attrs = {})
15
- attrs.each do |k, v|
16
- instance_variable_set "@#{k}", v
17
- end
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 :created_at => ::Time.now.to_f, :ttl => ttl, :v => v
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
@@ -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)
@@ -1,3 +1,3 @@
1
1
  module LockMethod
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
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 :obj => self, :method_id => method_id
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 :obj => self, :method_id => method_id, :args => args, :ttl => ttl
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.add_dependency 'cache', '>=0.2.1'
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
- date: 2011-03-15 00:00:00 -05:00
14
- default_executable:
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
- prerelease: false
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
- requirement: &id002 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id003 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id004 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id005 !ruby/object:Gem::Requirement
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: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
69
77
  type: :development
70
- version_requirements: *id005
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: "0"
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: "0"
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.6.2
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 for each one
124
- test_files:
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