sdbport 0.1.1 → 0.2.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.
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