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 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