sdbport 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,10 @@
1
1
  ## HEAD:
2
2
 
3
+ ## 0.2.0:
4
+
5
+ * Added destroy subcommand
6
+ * Batch put attributes in sets of 25
7
+
3
8
  ## 0.1.1:
4
9
 
5
10
  * Read domains with more than 100 items
data/README.md CHANGED
@@ -43,7 +43,6 @@ sdbport export -h
43
43
 
44
44
  ## Known Limitations
45
45
 
46
- * Single serialiazed process for import. Need to switch to batch put attributes.
47
46
  * Only supports importing into empty domain.
48
47
 
49
48
  ## Contributing
@@ -22,10 +22,6 @@ module Sdbport
22
22
  sdb.create_domain(domain) unless domain_exists?(domain)
23
23
  end
24
24
 
25
- def select(query, options = {})
26
- sdb.select(query, options).body
27
- end
28
-
29
25
  def select_and_follow_tokens(query, options = {})
30
26
  data = {}
31
27
  next_token = nil
@@ -48,8 +44,8 @@ module Sdbport
48
44
  count(domain).zero?
49
45
  end
50
46
 
51
- def put_attributes(domain, key, attributes, options = {})
52
- sdb.put_attributes domain, key, attributes, options
47
+ def batch_put_attributes(domain, attributes)
48
+ sdb.batch_put_attributes domain, attributes
53
49
  end
54
50
 
55
51
  def delete_domain(domain)
@@ -0,0 +1,38 @@
1
+ module Sdbport
2
+ class CLI
3
+ class Destroy
4
+
5
+ def destroy
6
+ opts = read_options
7
+ logger = SdbportLogger.new :log_level => opts[:level]
8
+ domain = Domain.new :name => opts[:name],
9
+ :region => opts[:region],
10
+ :access_key => opts[:access_key],
11
+ :secret_key => opts[:secret_key],
12
+ :logger => logger
13
+ domain.destroy
14
+ end
15
+
16
+ def read_options
17
+ Trollop::options do
18
+ version Sdbport::VERSION
19
+ banner <<-EOS
20
+
21
+ Destroy SimpleDB Domain
22
+
23
+ Usage:
24
+
25
+ sdbport destroy -a xxx -k yyy -r us-west-1 -n domain
26
+
27
+ EOS
28
+ opt :help, "Display Help"
29
+ opt :level, "Log Level", :type => :string, :default => 'info'
30
+ opt :name, "Simple DB Domain Name", :type => :string
31
+ opt :region, "AWS region", :type => :string
32
+ opt :access_key, "AWS Access Key ID", :type => :string
33
+ opt :secret_key, "AWS Secret Access Key", :type => :string
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -5,12 +5,12 @@ module Sdbport
5
5
  def purge
6
6
  opts = read_options
7
7
  logger = SdbportLogger.new :log_level => opts[:level]
8
- domain = Domain.new :name => opts[:name],
9
- :region => opts[:region],
10
- :access_key => opts[:access_key],
11
- :secret_key => opts[:secret_key],
12
- :logger => logger
13
- domain.purge
8
+ domain = Domain.new :name => opts[:name],
9
+ :region => opts[:region],
10
+ :access_key => opts[:access_key],
11
+ :secret_key => opts[:secret_key],
12
+ :logger => logger
13
+ domain.purge
14
14
  end
15
15
 
16
16
  def read_options
data/lib/sdbport/cli.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'trollop'
2
+ require 'sdbport/cli/destroy'
2
3
  require 'sdbport/cli/export'
3
4
  require 'sdbport/cli/import'
4
5
  require 'sdbport/cli/purge'
@@ -11,6 +12,8 @@ module Sdbport
11
12
  cmd = ARGV.shift
12
13
 
13
14
  case cmd
15
+ when 'destroy'
16
+ CLI::Destroy.new.destroy
14
17
  when 'export'
15
18
  CLI::Export.new.export
16
19
  when 'import'
@@ -21,7 +24,7 @@ module Sdbport
21
24
  puts Sdbport::VERSION
22
25
  else
23
26
  puts "Unkown command: '#{cmd}'." unless cmd == '-h'
24
- puts "sdbport [export|import|purge] OPTIONS"
27
+ puts "sdbport [destroy|export|import|purge] OPTIONS"
25
28
  puts "Append -h for help on specific subcommand."
26
29
  end
27
30
 
@@ -0,0 +1,28 @@
1
+ module Sdbport
2
+ class Domain
3
+ class Destroy
4
+
5
+ def initialize(args)
6
+ @name = args[:name]
7
+ @logger = args[:logger]
8
+ @access_key = args[:access_key]
9
+ @secret_key = args[:secret_key]
10
+ @region = args[:region]
11
+ end
12
+
13
+ def destroy
14
+ @logger.info "Destroying #{@name} in #{@region}."
15
+ sdb.delete_domain @name
16
+ end
17
+
18
+ private
19
+
20
+ def sdb
21
+ @sdb ||= AWS::SimpleDB.new :access_key => @access_key,
22
+ :secret_key => @secret_key,
23
+ :region => @region
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -10,6 +10,7 @@ module Sdbport
10
10
  @access_key = args[:access_key]
11
11
  @secret_key = args[:secret_key]
12
12
  @region = args[:region]
13
+ @buffer = {}
13
14
  end
14
15
 
15
16
  def import(input)
@@ -21,25 +22,37 @@ module Sdbport
21
22
 
22
23
  file = File.open(input, 'r')
23
24
  while (line = file.gets)
24
- add_line line
25
+ add_line_to_buffer line
26
+ write_buffer if buffer_full?
25
27
  end
28
+ write_buffer unless buffer_empty?
26
29
  true
27
30
  end
28
31
 
29
32
  private
30
33
 
31
- def create_domain
32
- sdb.create_domain_unless_present @name
33
- end
34
-
35
- def add_line(line)
34
+ def add_line_to_buffer(line)
36
35
  line.chomp!
37
36
  data = JSON.parse line
38
37
  id = data.first
39
38
  attributes = data.last
40
39
 
41
40
  @logger.debug "Adding #{id} with attributes #{attributes.to_s}."
42
- sdb.put_attributes @name, id, attributes
41
+ @buffer.merge!({ id => attributes })
42
+ end
43
+
44
+ def buffer_full?
45
+ @buffer.count > 24
46
+ end
47
+
48
+ def buffer_empty?
49
+ @buffer.count.zero?
50
+ end
51
+
52
+ def write_buffer
53
+ @logger.debug "Writing #{@buffer.count} entries to SimpleDB."
54
+ sdb.batch_put_attributes @name, @buffer
55
+ @buffer.clear
43
56
  end
44
57
 
45
58
  def ensure_domain_empty
@@ -51,6 +64,10 @@ module Sdbport
51
64
  end
52
65
  end
53
66
 
67
+ def create_domain
68
+ sdb.create_domain_unless_present @name
69
+ end
70
+
54
71
  def sdb
55
72
  @sdb ||= AWS::SimpleDB.new :access_key => @access_key,
56
73
  :secret_key => @secret_key,
@@ -1,3 +1,4 @@
1
+ require 'sdbport/domain/destroy'
1
2
  require 'sdbport/domain/export'
2
3
  require 'sdbport/domain/import'
3
4
  require 'sdbport/domain/purge'
@@ -21,16 +22,24 @@ module Sdbport
21
22
  domain_purge.purge
22
23
  end
23
24
 
25
+ def destroy
26
+ domain_destroy.destroy
27
+ end
28
+
24
29
  private
25
30
 
26
- def domain_import
27
- @domain_import ||= Domain::Import.new @args
31
+ def domain_destroy
32
+ @domain_destroy ||= Domain::Destroy.new @args
28
33
  end
29
34
 
30
35
  def domain_export
31
36
  @domain_export ||= Domain::Export.new @args
32
37
  end
33
38
 
39
+ def domain_import
40
+ @domain_import ||= Domain::Import.new @args
41
+ end
42
+
34
43
  def domain_purge
35
44
  @domain_purge ||= Domain::Purge.new @args
36
45
  end
@@ -1,3 +1,3 @@
1
1
  module Sdbport
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -22,15 +22,6 @@ describe Sdbport do
22
22
  @sdb.domains.should == ['domain1']
23
23
  end
24
24
 
25
- it "should perform select query given" do
26
- @fog_mock.should_receive(:select).
27
- with('select * from name', 'ConsistentRead' => true).
28
- and_return @body_stub
29
- @body_stub.stub :body => 'thegoods'
30
- @sdb.select('select * from name', 'ConsistentRead' => true).
31
- should == 'thegoods'
32
- end
33
-
34
25
  it "should perform select query given and next tokens" do
35
26
  body_stub0 = stub 'body0', :body => { 'Items' =>
36
27
  { 'id1' => 'val1' },
@@ -78,8 +69,10 @@ describe Sdbport do
78
69
  end
79
70
 
80
71
  it "should update the attributes for an item" do
81
- @fog_mock.should_receive(:put_attributes).with('domain', 'key', {'key' => 'value'}, { "option" => "123" })
82
- @sdb.put_attributes('domain', 'key', {'key' => 'value'}, { "option" => "123" })
72
+ @fog_mock.should_receive(:batch_put_attributes).with('domain', { 'item1' => { 'key1' => 'value1' },
73
+ 'item2' => { 'key2' => 'value2' } })
74
+ @sdb.batch_put_attributes('domain', { 'item1' => { 'key1' => 'value1' },
75
+ 'item2' => { 'key2' => 'value2' } })
83
76
  end
84
77
 
85
78
  context "testing counts" do
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sdbport do
4
+
5
+ before do
6
+ @logger_stub = logger_stub
7
+ @sdb_mock = sdb_mock
8
+ options = { :name => 'name',
9
+ :logger => @logger_stub,
10
+ :access_key => 'the-key',
11
+ :secret_key => 'the-secret',
12
+ :region => 'us-west-1' }
13
+ @destroy = Sdbport::Domain::Destroy.new options
14
+ end
15
+
16
+ it "should delete the given domain" do
17
+ @sdb_mock.should_receive(:delete_domain)
18
+ @destroy.destroy
19
+ end
20
+
21
+ end
@@ -14,20 +14,28 @@ describe Sdbport do
14
14
 
15
15
  context "when successful" do
16
16
  it "should import from the given input" do
17
- @line = '["item", {"key":["val1", "val2"]}]'
17
+ @line1 = '["itemA", {"key":["val1", "val2"]}]'
18
+ @line2 = '["itemB", {"key":["val3", "val4"]}]'
18
19
  @sdb_mock.should_receive(:create_domain_unless_present).
19
20
  with('name')
20
21
  @sdb_mock.should_receive(:domain_empty?).with('name').
21
22
  and_return true
22
23
  File.should_receive(:open).with('/tmp/file', 'r').
23
24
  and_return @file_mock
24
- @file_mock.should_receive(:gets).and_return @line
25
- @sdb_mock.should_receive(:put_attributes).
26
- with("name", "item", {"key"=>["val1", "val2"]})
25
+ @file_mock.should_receive(:gets).and_return @line1
26
+ @file_mock.should_receive(:gets).and_return @line2
27
+ @sdb_mock.should_receive(:batch_put_attributes).
28
+ with("name", { "itemA" => {
29
+ "key" => ["val1", "val2"]
30
+ },
31
+ "itemB" => {
32
+ "key" => ["val3", "val4"]
33
+ } })
27
34
  @file_mock.should_receive(:gets).and_return nil
28
35
  @import.import('/tmp/file').should be_true
29
36
  end
30
37
  end
38
+
31
39
  context "when unsuccessful" do
32
40
  it "should return false if the domain is not empty" do
33
41
  @sdb_mock.should_receive(:create_domain_unless_present).
data/spec/domain_spec.rb CHANGED
@@ -30,4 +30,10 @@ describe Sdbport do
30
30
  @domain.purge.should be_true
31
31
  end
32
32
 
33
+ it "should call domain_destroy" do
34
+ Sdbport::Domain::Destroy.stub :new => @mock
35
+ @mock.should_receive(:destroy).and_return true
36
+ @domain.destroy.should be_true
37
+ end
38
+
33
39
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdbport
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-30 00:00:00.000000000 Z
12
+ date: 2012-10-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70237921138580 !ruby/object:Gem::Requirement
16
+ requirement: &70151522838520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70237921138580
24
+ version_requirements: *70151522838520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fog
27
- requirement: &70237921138140 !ruby/object:Gem::Requirement
27
+ requirement: &70151522837360 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70237921138140
35
+ version_requirements: *70151522837360
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: trollop
38
- requirement: &70237921137660 !ruby/object:Gem::Requirement
38
+ requirement: &70151522807160 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70237921137660
46
+ version_requirements: *70151522807160
47
47
  description: Import and export AWS SimpleDB domains.
48
48
  email:
49
49
  - brett@weav.net
@@ -65,10 +65,12 @@ files:
65
65
  - lib/sdbport/aws.rb
66
66
  - lib/sdbport/aws/simpledb.rb
67
67
  - lib/sdbport/cli.rb
68
+ - lib/sdbport/cli/destroy.rb
68
69
  - lib/sdbport/cli/export.rb
69
70
  - lib/sdbport/cli/import.rb
70
71
  - lib/sdbport/cli/purge.rb
71
72
  - lib/sdbport/domain.rb
73
+ - lib/sdbport/domain/destroy.rb
72
74
  - lib/sdbport/domain/export.rb
73
75
  - lib/sdbport/domain/import.rb
74
76
  - lib/sdbport/domain/purge.rb
@@ -76,6 +78,7 @@ files:
76
78
  - lib/sdbport/version.rb
77
79
  - sdbport.gemspec
78
80
  - spec/aws/simpledb_spec.rb
81
+ - spec/domain/destroy_spec.rb
79
82
  - spec/domain/export_spec.rb
80
83
  - spec/domain/import_spec.rb
81
84
  - spec/domain/purge_spec.rb
@@ -96,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
99
  version: '0'
97
100
  segments:
98
101
  - 0
99
- hash: -1634563892266774728
102
+ hash: 3924510079821876667
100
103
  required_rubygems_version: !ruby/object:Gem::Requirement
101
104
  none: false
102
105
  requirements:
@@ -105,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
108
  version: '0'
106
109
  segments:
107
110
  - 0
108
- hash: -1634563892266774728
111
+ hash: 3924510079821876667
109
112
  requirements: []
110
113
  rubyforge_project:
111
114
  rubygems_version: 1.8.16
@@ -114,6 +117,7 @@ specification_version: 3
114
117
  summary: Import and export AWS SimpleDB domains.
115
118
  test_files:
116
119
  - spec/aws/simpledb_spec.rb
120
+ - spec/domain/destroy_spec.rb
117
121
  - spec/domain/export_spec.rb
118
122
  - spec/domain/import_spec.rb
119
123
  - spec/domain/purge_spec.rb