sdb_lock 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a9b9ebf2fa554880afaa6906692e45d7a04ab855
4
+ data.tar.gz: 684b125391fb61cb928bf685543ddd66987f7b4d
5
+ SHA512:
6
+ metadata.gz: cdf66afa2420112cdc27aa0b8ef656a926c46ed209b80b000a6ed391d1e76312a44aca1dbd9585b62387ec4c08a47237f04155c70284545e5aa58949241d4912
7
+ data.tar.gz: 4aae120e31e057fcbddf5411a7ffa363c0416efcf418c3ae0053266ec3a22d16556487770ac71bd4eff97e054b645ec9d456c7ea312e6a381d0050f0d1ab5d08
data/README.md CHANGED
@@ -58,6 +58,14 @@ lock.unlock_old(10)
58
58
 
59
59
  ````
60
60
 
61
+ ## Test
62
+
63
+ `AWS_REGION` environmental variable is required to run tests.
64
+
65
+ ```
66
+ $ AWS_REGION=ap-northeast-1 bundle exec rake
67
+ ```
68
+
61
69
  ## Limitation
62
70
 
63
71
  * Lock might remain by network failure or other reason. See `#unlock_old`.
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << 'test'
8
+ end
9
+
10
+ desc "Run tests"
11
+ task :default => :test
@@ -1,3 +1,3 @@
1
1
  class SdbLock
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/sdb_lock.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require "sdb_lock/version"
2
-
3
- require 'aws'
2
+ require 'aws-sdk'
4
3
 
5
4
  # Lock using SimpleDB conditional put.
6
5
  #
@@ -35,13 +34,12 @@ class SdbLock
35
34
  # @param [String] domain_name SimpleDB domain name
36
35
  # @param [Hash] options
37
36
  def initialize(domain_name, options = {})
38
- @sdb = AWS::SimpleDB.new(options)
39
- options = options.dup
40
- if options.has_key?(:create_domain)
41
- @sdb.domains.create(domain_name) if options[:create_domain]
42
- options.delete(:create_domain)
37
+ @sdb = ::Aws::SimpleDB::Client.new(options)
38
+ @domain_name = domain_name
39
+ unless domains.include? @domain_name
40
+ @sdb.create_domain(domain_name: @domain_name)
41
+ @domains = @sdb.list_domains.domain_names
43
42
  end
44
- @domain = @sdb.domains[domain_name]
45
43
  end
46
44
 
47
45
  # Try to lock resource_name
@@ -49,8 +47,22 @@ class SdbLock
49
47
  # @param [String] resource_name name to lock
50
48
  # @return [TrueClass] true when locked, unless false
51
49
  def try_lock(resource_name)
52
- attributes = {LOCK_TIME => format_time(Time.now), unless: LOCK_TIME}
53
- item(resource_name).attributes.set(attributes)
50
+ attributes = [
51
+ {
52
+ name: LOCK_TIME,
53
+ value: format_time(Time.now)
54
+ }
55
+ ]
56
+
57
+ @sdb.put_attributes(
58
+ domain_name: @domain_name,
59
+ item_name: resource_name,
60
+ attributes: attributes,
61
+ expected: {
62
+ name: LOCK_TIME,
63
+ exists: false
64
+ }
65
+ )
54
66
  if block_given?
55
67
  begin
56
68
  yield
@@ -59,7 +71,7 @@ class SdbLock
59
71
  end
60
72
  end
61
73
  true
62
- rescue AWS::SimpleDB::Errors::ConditionalCheckFailed
74
+ rescue ::Aws::SimpleDB::Errors::ConditionalCheckFailed
63
75
  false
64
76
  end
65
77
 
@@ -90,22 +102,35 @@ class SdbLock
90
102
  # Unlock resource_name
91
103
  # @param [String] resource_name name to unlock
92
104
  def unlock(resource_name, expected_lock_time = nil)
93
- if expected_lock_time
94
- item(resource_name).attributes.delete(LOCK_TIME, if: {LOCK_TIME => expected_lock_time})
105
+ expected = if expected_lock_time
106
+ {
107
+ name: LOCK_TIME,
108
+ value: expected_lock_time,
109
+ exists: true
110
+ }
95
111
  else
96
- item(resource_name).attributes.delete(LOCK_TIME)
112
+ {}
97
113
  end
114
+
115
+ @sdb.delete_attributes(
116
+ domain_name: @domain_name,
117
+ item_name: resource_name,
118
+ expected: expected
119
+ )
98
120
  true
99
- rescue AWS::SimpleDB::Errors::ConditionalCheckFailed
121
+ rescue ::Aws::SimpleDB::Errors::ConditionalCheckFailed
100
122
  false
101
123
  end
102
124
 
103
125
  # Locked time for resource_name
104
126
  # @return [Time] locked time, nil if it is not locked
105
127
  def locked_time(resource_name)
106
- attribute = item(resource_name).attributes[LOCK_TIME]
107
- lock_time_string = attribute.values.first
108
- Time.at(lock_time_string.to_i) if lock_time_string
128
+ attributes = item(resource_name)
129
+ unless attributes.empty?
130
+ attributes.each do |a|
131
+ break Time.at(a.value.to_i) if a.name == LOCK_TIME
132
+ end
133
+ end
109
134
  end
110
135
 
111
136
  # All locked resources
@@ -117,7 +142,8 @@ class SdbLock
117
142
  else
118
143
  cond = "`#{LOCK_TIME}` is not null"
119
144
  end
120
- @domain.items.where(cond).map(&:name)
145
+ statement = "SELECT * FROM #{@domain_name} WHERE #{cond}"
146
+ @sdb.select(select_expression: statement).items.map { |i| i.name }
121
147
  end
122
148
 
123
149
  # Unlock old resources.
@@ -130,9 +156,11 @@ class SdbLock
130
156
  targets = locked_resources(age_in_seconds)
131
157
  unlocked = []
132
158
  targets.each do |resource_name|
133
- values = item(resource_name).attributes[LOCK_TIME].values
134
- next if !values || !values.first || values.first > format_time(Time.now - age_in_seconds)
135
- succ = unlock(resource_name, values.first)
159
+ value = item(resource_name).each do |attribute|
160
+ break attribute.value if attribute.name == LOCK_TIME
161
+ end
162
+ next if !value || value > format_time(Time.now - age_in_seconds)
163
+ succ = unlock(resource_name, value)
136
164
  unlocked << resource_name if succ
137
165
  end
138
166
  unlocked
@@ -140,8 +168,15 @@ class SdbLock
140
168
 
141
169
  private
142
170
 
171
+ def domains
172
+ @domains ||= @sdb.list_domains.domain_names
173
+ end
174
+
143
175
  def item(resource_name)
144
- @domain.items[resource_name]
176
+ @sdb.get_attributes(
177
+ domain_name: @domain_name,
178
+ item_name: resource_name
179
+ ).attributes
145
180
  end
146
181
 
147
182
  # Format time to compare lexicographically
data/sdb_lock.gemspec CHANGED
@@ -15,7 +15,8 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = SdbLock::VERSION
17
17
 
18
- gem.add_dependency 'aws-sdk', '~> 1.5.7'
18
+ gem.add_dependency 'aws-sdk', '~> 2'
19
19
 
20
20
  gem.add_development_dependency 'rake', '~> 0.9.2.2'
21
+ gem.add_development_dependency 'minitest'
21
22
  end
@@ -1,13 +1,10 @@
1
- require 'minitest/unit'
2
1
  require 'minitest/autorun'
3
2
  require "sdb_lock"
4
3
 
5
- class LockTest < MiniTest::Unit::TestCase
4
+ class LockTest < MiniTest::Test
6
5
  def setup
7
6
  @lock = SdbLock.new(
8
- 'lock_test',
9
- create_domain: true,
10
- simple_db_endpoint: "sdb.ap-northeast-1.amazonaws.com"
7
+ 'lock_test'
11
8
  )
12
9
  @lock.unlock("test")
13
10
  end
metadata CHANGED
@@ -1,48 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdb_lock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - KAWACHI Takashi
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-10-04 00:00:00.000000000 Z
11
+ date: 2016-03-31 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: aws-sdk
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 1.5.7
19
+ version: '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: 1.5.7
26
+ version: '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
37
33
  version: 0.9.2.2
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
45
40
  version: 0.9.2.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
46
55
  description: Lock library using Amazon SimpleDB
47
56
  email:
48
57
  - kawachi@p-lucky.net
@@ -50,7 +59,7 @@ executables: []
50
59
  extensions: []
51
60
  extra_rdoc_files: []
52
61
  files:
53
- - .gitignore
62
+ - ".gitignore"
54
63
  - Gemfile
55
64
  - LICENSE
56
65
  - README.md
@@ -58,36 +67,29 @@ files:
58
67
  - lib/sdb_lock.rb
59
68
  - lib/sdb_lock/version.rb
60
69
  - sdb_lock.gemspec
61
- - test/lock_test.rb
70
+ - test/test_lock.rb
62
71
  homepage: ''
63
72
  licenses: []
73
+ metadata: {}
64
74
  post_install_message:
65
75
  rdoc_options: []
66
76
  require_paths:
67
77
  - lib
68
78
  required_ruby_version: !ruby/object:Gem::Requirement
69
- none: false
70
79
  requirements:
71
- - - ! '>='
80
+ - - ">="
72
81
  - !ruby/object:Gem::Version
73
82
  version: '0'
74
- segments:
75
- - 0
76
- hash: 1769990317450640860
77
83
  required_rubygems_version: !ruby/object:Gem::Requirement
78
- none: false
79
84
  requirements:
80
- - - ! '>='
85
+ - - ">="
81
86
  - !ruby/object:Gem::Version
82
87
  version: '0'
83
- segments:
84
- - 0
85
- hash: 1769990317450640860
86
88
  requirements: []
87
89
  rubyforge_project:
88
- rubygems_version: 1.8.24
90
+ rubygems_version: 2.4.5
89
91
  signing_key:
90
- specification_version: 3
92
+ specification_version: 4
91
93
  summary: Lock library using Amazon SimpleDB
92
94
  test_files:
93
- - test/lock_test.rb
95
+ - test/test_lock.rb