lock_method 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -6,12 +6,17 @@ It's like <tt>alias_method</tt>, but it's <tt>lock_method</tt>!
6
6
 
7
7
  require 'lock_method'
8
8
  class Blog
9
- # [...]
9
+ attr_accessor :url
10
+
10
11
  def get_latest_entries
11
12
  sleep 5
12
13
  end
13
- # [...]
14
14
  lock_method :get_latest_entries
15
+
16
+ # used by lock_method to differentiate between instances
17
+ def hash
18
+ url.hash
19
+ end
15
20
  end
16
21
 
17
22
  Then you can do
@@ -23,12 +28,22 @@ Just in case, you can clear them
23
28
 
24
29
  my_blog.clear_method_lock :get_latest_entries
25
30
 
26
- == One lock per method
31
+ == Ignores arguments when locking a method
27
32
 
28
33
  lock_method ignores arguments when locking. So if you call Foo.bar(:a), calls to Foo.bar(:b) will be locked until the first call finishes.
29
34
 
30
35
  Maybe future versions will support this.
31
36
 
37
+ == Defining #hash
38
+
39
+ If you want to lock instance methods, you should define <tt>#hash</tt> on those instances.
40
+
41
+ You should follow Ruby convention and have <tt>#hash</tt> return a <tt>Fixnum</tt>.
42
+
43
+ Ideally, you should try to make a <tt>String</tt> or a <tt>Hash</tt> and call the standard <tt>#hash</tt> on that.
44
+
45
+ Note: this is NOT the same thing as <tt>#to_hash</tt>! That returns a <tt>Hash</tt>... but what we want is an integer "hash code."
46
+
32
47
  == Configuration (and supported cache clients)
33
48
 
34
49
  The default is to use filesystem lockfiles, usually in <tt>/tmp/lock_method/*</tt>.
data/lib/lock_method.rb CHANGED
@@ -55,5 +55,5 @@ end
55
55
 
56
56
  unless ::Object.method_defined? :lock_method
57
57
  ::Object.send :include, ::LockMethod::InstanceMethods
58
- ::Object.extend ::LockMethod::ClassMethods
58
+ ::Class.send :include, ::LockMethod::ClassMethods
59
59
  end
@@ -85,7 +85,15 @@ module LockMethod
85
85
  end
86
86
 
87
87
  def cache_key
88
- [ 'LockMethod', 'Lock', method_signature ].join ','
88
+ if obj.is_a? ::Class
89
+ [ 'LockMethod', 'Lock', method_signature ].join ','
90
+ else
91
+ [ 'LockMethod', 'Lock', method_signature, obj_hash ].join ','
92
+ end
93
+ end
94
+
95
+ def obj_hash
96
+ @obj_hash ||= obj.hash
89
97
  end
90
98
 
91
99
  def in_force?
@@ -1,3 +1,3 @@
1
1
  module LockMethod
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/test/helper.rb CHANGED
@@ -25,6 +25,9 @@ class Blog1
25
25
  ["voo vaa #{name}"]
26
26
  end
27
27
  lock_method :get_latest_entries2, 5 # second
28
+ def hash
29
+ name.hash
30
+ end
28
31
  end
29
32
 
30
33
  class Blog2
@@ -42,13 +45,6 @@ class Blog2
42
45
  end
43
46
  end
44
47
 
45
- def new_instance_of_my_blog
46
- Blog1.new 'my_blog', 'http://my_blog.example.com'
47
- end
48
- def new_instance_of_another_blog
49
- Blog1.new 'another_blog', 'http://another_blog.example.com'
50
- end
51
-
52
48
  class Test::Unit::TestCase
53
49
 
54
50
  end
data/test/shared_tests.rb CHANGED
@@ -1,3 +1,10 @@
1
+ def new_instance_of_my_blog
2
+ Blog1.new 'my_blog', 'http://my_blog.example.com'
3
+ end
4
+ def new_instance_of_another_blog
5
+ Blog1.new 'another_blog', 'http://another_blog.example.com'
6
+ end
7
+
1
8
  module SharedTests
2
9
  def test_locked_method_return_value
3
10
  assert_equal ["hello from my_blog"], new_instance_of_my_blog.get_latest_entries
@@ -104,6 +111,20 @@ module SharedTests
104
111
  end
105
112
  end
106
113
 
114
+ def test_instance_method_lock_is_unique_to_instance
115
+ pid = Kernel.fork { new_instance_of_my_blog.get_latest_entries }
116
+
117
+ # give it a bit of time to lock
118
+ sleep 1
119
+
120
+ # the blocker won't have finished
121
+ assert_nothing_raised do
122
+ new_instance_of_another_blog.get_latest_entries
123
+ end
124
+
125
+ Process.wait pid
126
+ end
127
+
107
128
  def test_clear_instance_method_lock
108
129
  pid = Kernel.fork { new_instance_of_my_blog.get_latest_entries }
109
130
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lock_method
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Seamus Abshere
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-23 00:00:00 -06:00
18
+ date: 2011-03-02 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency