sdb_lock 0.0.2 → 0.1.0

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