simplydb 0.0.2 → 0.0.3

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.
@@ -0,0 +1,236 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ require "json"
3
+
4
+ SimplyDB::Server.get('/raise_error') do
5
+ raise SimplyDB::AccessFailure, "With explaination of why..."
6
+ end
7
+
8
+ describe SimplyDB::Server do
9
+ include Rack::Test::Methods
10
+
11
+ let(:default_domains) {["activity", "location", "notification", "person"]}
12
+
13
+ before do
14
+ Timecop.freeze Time.local(2011, 4, 13, 1, 40)
15
+ end
16
+
17
+ before(:all) do
18
+ Timecop.freeze Time.local(2011, 4, 13, 1, 40)
19
+
20
+ VCR.use_cassette("create_env", :record => :none) do
21
+
22
+ default_domains.each do |domain|
23
+ interface.create_domain(domain)
24
+ end
25
+ interface.put_attributes("activity", "testID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
26
+ interface.put_attributes("activity", "updateID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
27
+ interface.put_attributes("activity", "delete_partialID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
28
+ interface.put_attributes("activity", "delete_allID", {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}, {}, true)
29
+ end
30
+ end
31
+
32
+ after(:all) do
33
+ Timecop.freeze Time.local(2011, 4, 13, 1, 40)
34
+ VCR.use_cassette("destroy_env", :record => :none) do
35
+ default_domains.each do |domain|
36
+ interface.delete_domain(domain)
37
+ end
38
+ end
39
+ Timecop.return
40
+ end
41
+
42
+ def app
43
+ SimplyDB::Server.set :aws_secret_key, ENV['AWS_SECRET_KEY'] || 'thhyyt9ZU3bo0Q/ZOt9C0dD8MZzJS8AUvrE9/B82'
44
+ SimplyDB::Server.set :aws_access_key, ENV['AWS_ACCESS_KEY'] || '1VRWH6Y8EA9RKV7NHSR2'
45
+ SimplyDB::Server.set :environment, :test
46
+ SimplyDB::Server
47
+ end
48
+
49
+ def interface
50
+ SimplyDB::Interface.new(
51
+ :secret_key => ENV['AWS_SECRET_KEY'] || 'thhyyt9ZU3bo0Q/ZOt9C0dD8MZzJS8AUvrE9/B82',
52
+ :access_key => ENV['AWS_ACCESS_KEY'] || '1VRWH6Y8EA9RKV7NHSR2'
53
+ )
54
+ end
55
+
56
+ shared_examples_for "successful JSON response" do
57
+ it "returns successful" do
58
+ last_response.status.should == 200
59
+ end
60
+
61
+ it "sets the content type for JSON" do
62
+ last_response.content_type.should == "application/json"
63
+ end
64
+ end
65
+
66
+ describe "domain operations" do
67
+
68
+ describe "GET#domains" do
69
+ use_vcr_cassette "get_domains", :record => :none
70
+
71
+ before do
72
+ get '/domains'
73
+ end
74
+
75
+ it_behaves_like "successful JSON response"
76
+
77
+ it "returns list of domains" do
78
+ JSON.parse(last_response.body).should == ["activity", "location", "notification", "person"]
79
+ end
80
+ end
81
+
82
+ describe "PUT#domains" do
83
+ use_vcr_cassette "put_domains", :record => :none
84
+
85
+ before do
86
+ put '/domains', {:name => 'information'}
87
+ end
88
+
89
+ after do
90
+ interface.delete_domain("information")
91
+ end
92
+
93
+ it_behaves_like "successful JSON response"
94
+
95
+ it "returns a list of current domains" do
96
+ JSON.parse(last_response.body).should == ["activity", "information", "location", "notification", "person"]
97
+ end
98
+ end
99
+
100
+ describe "DELETE#domains" do
101
+ use_vcr_cassette "delete_domains", :record => :none
102
+
103
+ before do
104
+ interface.create_domain("information")
105
+ delete '/domains', {:name => 'information'}
106
+ end
107
+
108
+ it_behaves_like "successful JSON response"
109
+
110
+ it "returns a list of current domains" do
111
+ JSON.parse(last_response.body).should == ["activity", "location", "notification", "person"]
112
+ end
113
+ end
114
+
115
+ describe "GET#domains by name" do
116
+ use_vcr_cassette "show_domains", :record => :none
117
+
118
+ before do
119
+ get '/domains/activity'
120
+ end
121
+
122
+ it_behaves_like "successful JSON response"
123
+
124
+ it "returns the meta data" do
125
+ attributes = JSON.parse(last_response.body)
126
+ attributes.delete("Timestamp")
127
+ attributes.should == {"ItemCount"=>"4", "ItemNamesSizeBytes"=>"42", "AttributeNameCount"=>"6", "AttributeNamesSizeBytes"=>"26", "AttributeValueCount"=>"24", "AttributeValuesSizeBytes"=>"172"}
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "item operations" do
133
+ describe "GET#items by id" do
134
+ use_vcr_cassette "get_items", :record => :none
135
+
136
+ before do
137
+ get '/domains/activity/items/testID'
138
+ end
139
+
140
+ it_behaves_like "successful JSON response"
141
+
142
+ it "returns list of the current attributes" do
143
+ JSON.parse(last_response.body).should == {"zip"=>"90210", "address"=>"123 Main St", "age"=>"27", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}
144
+ end
145
+ end
146
+
147
+ describe "PUT#items by id" do
148
+ use_vcr_cassette "put_items", :record => :none
149
+
150
+ before do
151
+ put '/domains/activity/items/updateID', "item" => {"zip" => "12345", "age" => "28"}
152
+ end
153
+
154
+ it_behaves_like "successful JSON response"
155
+
156
+ it "returns an empty response" do
157
+ last_response.body.should == ""
158
+ end
159
+
160
+ it "updates the attributes" do
161
+ interface.get_attributes("activity", "updateID").should == {"zip"=>"12345", "address"=>"123 Main St", "age"=>"28", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}
162
+ end
163
+ end
164
+
165
+ describe "GET#items" do
166
+ use_vcr_cassette "get_all_items", :record => :none
167
+ before do
168
+ get '/domains/activity/items'
169
+ end
170
+
171
+ it_behaves_like "successful JSON response"
172
+
173
+ it "returns a hash of item id to attributes" do
174
+ JSON.parse(last_response.body).should == [
175
+ {"testID"=>{"zip"=>"90210", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"27", "state"=>"CA", "city"=>"San Francisco"}},
176
+ {"updateID"=>{"zip"=>"12345", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"28", "state"=>"CA", "city"=>"San Francisco"}},
177
+ {"delete_partialID"=>{"zip"=>"90210", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"27", "state"=>"CA", "city"=>"San Francisco"}},
178
+ {"delete_allID"=>{"zip"=>"90210", "address"=>"123 Main St", "name"=>"John Smith", "age"=>"27", "state"=>"CA", "city"=>"San Francisco"}}
179
+ ]
180
+ end
181
+ end
182
+
183
+ describe "DELETE#items by id" do
184
+ context "delete certain attributes" do
185
+ use_vcr_cassette "delete_items", :record => :none
186
+
187
+ before do
188
+ delete '/domains/activity/items/delete_partialID', "item" => {"zip" => "90210", "age" => "27"}
189
+ end
190
+
191
+ it_behaves_like "successful JSON response"
192
+
193
+ it "returns an empty response" do
194
+ last_response.body.should == ""
195
+ end
196
+
197
+ it "updates the attributes" do
198
+ interface.get_attributes("activity", "delete_partialID").should == {"address"=>"123 Main St", "name"=>"John Smith", "state"=>"CA", "city"=>"San Francisco"}
199
+ end
200
+ end
201
+
202
+ context "deletes the entire item" do
203
+ use_vcr_cassette "delete_items_all", :record => :none
204
+
205
+ before do
206
+ delete '/domains/activity/items/delete_allID'
207
+ end
208
+
209
+ it_behaves_like "successful JSON response"
210
+
211
+ it "returns an empty response" do
212
+ last_response.body.should == ""
213
+ end
214
+
215
+ it "updates the attributes" do
216
+ interface.get_attributes("activity", "delete_allID").should == {}
217
+ end
218
+ end
219
+ end
220
+
221
+ describe "when handling errors from SimplyDB::Error" do
222
+ before do
223
+ get '/raise_error'
224
+ end
225
+
226
+ it "should proxy the HTTP error code associated with the SimplyDB::Error" do
227
+ last_response.status.should == SimplyDB::AccessFailure.http_status_code
228
+ end
229
+
230
+ it "should set a header with the supplied error message" do
231
+ last_response.headers['AMZ-ERROR-TYPE'].should == "AccessFailure"
232
+ last_response.headers['AMZ-ERROR-MESSAGE'].should == "With explaination of why..."
233
+ end
234
+ end
235
+ end
236
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,24 +1,32 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'simplydb'
4
- require 'spec'
5
- require 'spec/autorun'
6
3
 
7
4
  require 'rubygems'
5
+ require 'rack/test'
6
+ require 'rspec'
7
+ require 'webmock/rspec'
8
+ require 'vcr'
8
9
  require 'timecop'
10
+ require 'simplydb'
9
11
 
10
- Spec::Runner.configure do |config|
12
+ Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f}
13
+
14
+ Rspec.configure do |config|
11
15
  def access_key
12
- return '12345'
16
+ '12345'
13
17
  end
14
18
 
15
19
  def secret_key
16
- return '67890'
20
+ '67890'
17
21
  end
18
-
19
- def run_today(time = Time.gm(2008, 9, 1, 12, 0, 0))
20
- Timecop.freeze(time) do
21
- yield
22
- end
22
+
23
+ config.extend VCR::RSpec::Macros
24
+
25
+ config.before do
26
+ Timecop.freeze Time.local(2011,4,11, 23, 9)
27
+ end
28
+
29
+ config.after do
30
+ Timecop.return
23
31
  end
24
32
  end
@@ -0,0 +1,7 @@
1
+ VCR.config do |c|
2
+ c.cassette_library_dir = File.join(File.dirname(__FILE__), '..', 'fixtures', 'vcr')
3
+ c.stub_with :webmock
4
+ c.default_cassette_options = {
5
+ :match_requests_on => [:uri, :method, :body]
6
+ }
7
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simplydb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease: false
4
+ hash: 25
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - JT Archie
@@ -15,43 +15,39 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-06 00:00:00 -07:00
18
+ date: 2011-04-14 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rspec
22
+ name: sinatra
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 13
29
+ hash: 3
30
30
  segments:
31
- - 1
32
- - 2
33
- - 9
34
- version: 1.2.9
35
- type: :development
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
38
- name: typhoeus
36
+ name: nokogiri
39
37
  prerelease: false
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
41
  - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 45
43
+ hash: 3
46
44
  segments:
47
45
  - 0
48
- - 1
49
- - 27
50
- version: 0.1.27
46
+ version: "0"
51
47
  type: :runtime
52
48
  version_requirements: *id002
53
49
  - !ruby/object:Gem::Dependency
54
- name: nokogiri
50
+ name: rest-client
55
51
  prerelease: false
56
52
  requirement: &id003 !ruby/object:Gem::Requirement
57
53
  none: false
@@ -60,69 +56,139 @@ dependencies:
60
56
  - !ruby/object:Gem::Version
61
57
  hash: 3
62
58
  segments:
63
- - 1
64
- - 4
65
- - 2
66
- version: 1.4.2
59
+ - 0
60
+ version: "0"
67
61
  type: :runtime
68
62
  version_requirements: *id003
69
63
  - !ruby/object:Gem::Dependency
70
- name: uuidtools
64
+ name: json
71
65
  prerelease: false
72
66
  requirement: &id004 !ruby/object:Gem::Requirement
73
67
  none: false
74
68
  requirements:
75
69
  - - ">="
76
70
  - !ruby/object:Gem::Version
77
- hash: 9
71
+ hash: 3
78
72
  segments:
79
- - 2
80
- - 1
81
- - 1
82
- version: 2.1.1
73
+ - 0
74
+ version: "0"
83
75
  type: :runtime
84
76
  version_requirements: *id004
85
- description: A minimal interface to Amazon SimpleDB that has separation of interfaces. From the low level HTTP request access to high level Ruby abstraction ORM.
86
- email: jtarchie@gmail.com
77
+ - !ruby/object:Gem::Dependency
78
+ name: rspec
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :development
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: rack-test
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: webmock
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :development
118
+ version_requirements: *id007
119
+ - !ruby/object:Gem::Dependency
120
+ name: vcr
121
+ prerelease: false
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ type: :development
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: timecop
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 3
142
+ segments:
143
+ - 0
144
+ version: "0"
145
+ type: :development
146
+ version_requirements: *id009
147
+ description: Simple interface for SimpleDB.
148
+ email:
149
+ - jtarchie@gmail.com
87
150
  executables: []
88
151
 
89
152
  extensions: []
90
153
 
91
- extra_rdoc_files:
92
- - LICENSE
93
- - README.rdoc
154
+ extra_rdoc_files: []
155
+
94
156
  files:
95
- - .document
96
157
  - .gitignore
97
- - LICENSE
98
- - README.rdoc
158
+ - Gemfile
159
+ - README.md
99
160
  - Rakefile
100
- - VERSION
101
- - examples/interface.rb
102
- - examples/record.rb
103
161
  - lib/simplydb.rb
104
162
  - lib/simplydb/client.rb
105
- - lib/simplydb/clients/typhoeus.rb
106
163
  - lib/simplydb/error.rb
107
- - lib/simplydb/extensions.rb
108
164
  - lib/simplydb/interface.rb
109
- - lib/simplydb/record.rb
110
- - lib/simplydb/record/base.rb
165
+ - lib/simplydb/server.rb
166
+ - lib/simplydb/version.rb
111
167
  - simplydb.gemspec
112
168
  - spec/client_spec.rb
113
169
  - spec/error_spec.rb
114
- - spec/extensions_spec.rb
170
+ - spec/fixtures/vcr/create_env.yml
171
+ - spec/fixtures/vcr/delete_domains.yml
172
+ - spec/fixtures/vcr/delete_items.yml
173
+ - spec/fixtures/vcr/delete_items_all.yml
174
+ - spec/fixtures/vcr/destroy_env.yml
175
+ - spec/fixtures/vcr/get_all_items.yml
176
+ - spec/fixtures/vcr/get_domains.yml
177
+ - spec/fixtures/vcr/get_items.yml
178
+ - spec/fixtures/vcr/put_domains.yml
179
+ - spec/fixtures/vcr/put_items.yml
180
+ - spec/fixtures/vcr/show_domains.yml
115
181
  - spec/interface_spec.rb
116
- - spec/record/base_spec.rb
117
- - spec/spec.opts
182
+ - spec/server_spec.rb
118
183
  - spec/spec_helper.rb
184
+ - spec/support/vcr.rb
119
185
  has_rdoc: true
120
- homepage: http://github.com/jtarchie/simplydb
186
+ homepage: http://rubygems.org/gems/simplydb
121
187
  licenses: []
122
188
 
123
189
  post_install_message:
124
- rdoc_options:
125
- - --charset=UTF-8
190
+ rdoc_options: []
191
+
126
192
  require_paths:
127
193
  - lib
128
194
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -145,17 +211,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
211
  version: "0"
146
212
  requirements: []
147
213
 
148
- rubyforge_project:
149
- rubygems_version: 1.3.7
214
+ rubyforge_project: simplydb
215
+ rubygems_version: 1.4.2
150
216
  signing_key:
151
217
  specification_version: 3
152
- summary: A minimal interface to Amazon SimpleDB.
218
+ summary: Simple interface for SimpleDB.
153
219
  test_files:
154
220
  - spec/client_spec.rb
155
221
  - spec/error_spec.rb
156
- - spec/extensions_spec.rb
222
+ - spec/fixtures/vcr/create_env.yml
223
+ - spec/fixtures/vcr/delete_domains.yml
224
+ - spec/fixtures/vcr/delete_items.yml
225
+ - spec/fixtures/vcr/delete_items_all.yml
226
+ - spec/fixtures/vcr/destroy_env.yml
227
+ - spec/fixtures/vcr/get_all_items.yml
228
+ - spec/fixtures/vcr/get_domains.yml
229
+ - spec/fixtures/vcr/get_items.yml
230
+ - spec/fixtures/vcr/put_domains.yml
231
+ - spec/fixtures/vcr/put_items.yml
232
+ - spec/fixtures/vcr/show_domains.yml
157
233
  - spec/interface_spec.rb
158
- - spec/record/base_spec.rb
234
+ - spec/server_spec.rb
159
235
  - spec/spec_helper.rb
160
- - examples/interface.rb
161
- - examples/record.rb
236
+ - spec/support/vcr.rb