nsisam 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.2
5
+ - 1.9.3
6
+
7
+ script: "bundle exec rake spec"
8
+
9
+ notifications:
10
+ recipients:
11
+ - rmanhaes@gmail.com
12
+ - d.camata@gmail.com
13
+
14
+ branches:
15
+ only:
16
+ - master
data/README.rdoc CHANGED
@@ -1,8 +1,24 @@
1
1
  = nsisam
2
2
 
3
+ {<img src="https://secure.travis-ci.org/nsi-iff/nsisam-ruby.png"/>}[http://travis-ci.org/nsi-iff/nsisam-ruby]
4
+
3
5
  Just a simple and lightweight package to access a SAM node using Ruby. It also includes a simple fake client to
4
6
  be used in your application when a real server is not available to receive requests.
5
7
 
8
+ == How to test
9
+
10
+ Just run:
11
+
12
+ rake spec
13
+
14
+
15
+ By default, all tests are run against a fake server. If you want to use a real SAM, you must create a
16
+ spec/integration.yml file (there is a example file in spec/integration.yml.example) and point it to your
17
+ SAM instance. You must also set the NSI_SAM_INTEGRATION environment variable to any value:
18
+
19
+ NSI_SAM_INTEGRATION=1 rake spec
20
+
21
+
6
22
  == Contributing to nsisam
7
23
 
8
24
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
@@ -17,4 +33,3 @@ be used in your application when a real server is not available to receive reque
17
33
 
18
34
  Copyright (c) 2012 Douglas Camata. See LICENSE.txt for
19
35
  further details.
20
-
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.4
1
+ 0.6.0
data/lib/nsisam/client.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require "json"
2
2
  require "net/http"
3
3
  require "digest"
4
+ require "base64"
4
5
 
5
6
  require File.dirname(__FILE__) + '/configuration'
6
7
  require File.dirname(__FILE__) + '/errors'
8
+ require File.dirname(__FILE__) + '/response'
7
9
 
8
10
  module NSISam
9
11
  class Client
@@ -37,7 +39,23 @@ module NSISam
37
39
  def store(data)
38
40
  request_data = {:value => data}.to_json
39
41
  request = prepare_request :PUT, request_data
40
- execute_request(request)
42
+ Response.new(execute_request(request))
43
+ end
44
+
45
+ # Store a file in SAM. If the file will be used by other NSI's service
46
+ # you should pass an additional 'type' parameter.
47
+ #
48
+ # @param [Object] file_content json serializable object
49
+ # @param [Symbol] type of the file to be stored. Can be either :doc and :video.
50
+ # @return [Response] object with access to the key and the sha512 checkum of the stored data
51
+ #
52
+ # @raise [NSISam::Errors::Client::AuthenticationError] when user and password doesn't match
53
+ #
54
+ # @example
55
+ # nsisam.store_file(File.read("foo.txt"))
56
+ # nsisam.store_file(File.read("foo.txt"), :video)
57
+ def store_file(file_content, type=:file)
58
+ store(type => Base64.encode64(file_content))
41
59
  end
42
60
 
43
61
  # Delete data at a given SAM key
@@ -54,16 +72,13 @@ module NSISam
54
72
  def delete(key)
55
73
  request_data = {:key => key}.to_json
56
74
  request = prepare_request :DELETE, request_data
57
- execute_request(request)
75
+ Response.new(execute_request(request))
58
76
  end
59
77
 
60
78
  # Recover data stored at a given SAM key
61
79
  #
62
80
  # @param [String] key of the value to acess
63
- # @return [Hash] response
64
- # * "from_user" [String] the user who stored the value
65
- # * "date" [String] the date when the value was stored
66
- # * "data" [String, Hash, Array] the data stored at that key
81
+ # @return [Response] response object holding the file and some metadata
67
82
  #
68
83
  # @raise [NSISam::Errors::Client::KeyNotFoundError] when the key doesn't exists
69
84
  # @raise [NSISam::Errors::Client::AuthenticationError] when user and password doesn't match
@@ -75,16 +90,38 @@ module NSISam
75
90
  request = prepare_request :GET, request_data
76
91
  response = execute_request(request)
77
92
  verify_checksum(response["data"], expected_checksum) unless expected_checksum.nil?
78
- response
93
+ Response.new(response)
94
+ end
95
+
96
+ # Recover a file stored at a given SAM key
97
+ #
98
+ # @param [String] key of the file to access
99
+ # @param [Symbol] type of the file to be recovered. Can be either :doc and :video.
100
+ # @return [Response] response object holding the file and some metadata
101
+ #
102
+ # @raise [NSISam::Errors::Client::KeyNotFoundError] when the key doesn't exists
103
+ # @raise [NSISam::Errors::Client::AuthenticationError] when user and password doesn't match
104
+ #
105
+ # @note Use of wrong "type" parameter can generate errors.
106
+ #
107
+ # @example
108
+ # nsisam.get_file("some key")
109
+ # nsisam.store_file("test", :doc) # stored at key 'test_key'
110
+ # nsisam.get_file("test_key", :doc)
111
+ def get_file(key, type=:file, expected_checksum = nil)
112
+ response = get(key, expected_checksum)
113
+ Response.new(
114
+ 'key' => response.key,
115
+ 'checksum' => response.checksum,
116
+ 'data' => Base64.decode64(response.data[type.to_s]),
117
+ 'deleted' => response.deleted?)
79
118
  end
80
119
 
81
120
  # Update data stored at a given SAM key
82
121
  #
83
122
  # @param [String] key of the data to update
84
123
  # @param [String, Hash, Array] data to be stored at the key
85
- # @return [Hash] response
86
- # * "key" [String] just to value key again
87
- # * "checksum" [String] the new sha512 checksum of the key's data
124
+ # @return [Response] response object holding the file and some metadata
88
125
  #
89
126
  # @raise [NSISam::Errors::Client::KeyNotFoundError] when the key doesn't exists
90
127
  # @raise [NSISam::Errors::Client::AuthenticationError] when user and password doesn't match
@@ -94,7 +131,26 @@ module NSISam
94
131
  def update(key, value)
95
132
  request_data = {:key => key, :value => value}.to_json
96
133
  request = prepare_request :POST, request_data
97
- execute_request(request)
134
+ Response.new(execute_request(request))
135
+ end
136
+
137
+ # Update file stored at a given SAM key
138
+ #
139
+ # @param [String] key of the file to update
140
+ # @param [Symbol] type of the file to be recovered. Can be either :doc and :video.
141
+ # @param [String] new_content content of the new file
142
+ # @return [Response] response object holding the file and some metadata
143
+ #
144
+ # @raise [NSISam::Errors::Client::KeyNotFoundError] when the key doesn't exists
145
+ # @raise [NSISam::Errors::Client::AuthenticationError] when user and password doesn't match
146
+ #
147
+ # @example
148
+ # nsisam.update_file("my key", "my value")
149
+ # nsisam.update_file("my key", "my value", :video)
150
+ # nsisam.update_file("my key", "my value", :doc)
151
+ def update_file(key, type=:file, new_content)
152
+ encoded = Base64.encode64(new_content)
153
+ update(key, type => encoded)
98
154
  end
99
155
 
100
156
  # Pre-configure the NSISam module with default params for the NSISam::Client
@@ -112,6 +168,10 @@ module NSISam
112
168
  Configuration.instance_eval(&block)
113
169
  end
114
170
 
171
+ def download_link_for_file(key)
172
+ "http://#{@host}:#{@port}/file/#{key}"
173
+ end
174
+
115
175
  private
116
176
 
117
177
  def prepare_request(verb, body)
@@ -127,6 +187,7 @@ module NSISam
127
187
  response = Net::HTTP.start @host, @port do |http|
128
188
  http.request(request)
129
189
  end
190
+ response
130
191
  rescue Errno::ECONNREFUSED => e
131
192
  raise NSISam::Errors::Client::ConnectionRefusedError
132
193
  else
@@ -141,6 +202,5 @@ module NSISam
141
202
  sha512_checksum = Digest::SHA512.hexdigest(data)
142
203
  raise NSISam::Errors::Client::ChecksumMismatchError unless sha512_checksum == expected_checksum
143
204
  end
144
-
145
205
  end
146
206
  end
@@ -1,4 +1,6 @@
1
1
  require 'json'
2
+ require 'base64'
3
+ require File.dirname(__FILE__) + '/response'
2
4
 
3
5
  module NSISam
4
6
  class FakeClient
@@ -12,6 +14,12 @@ module NSISam
12
14
  {'key' => key, 'checksum' => 0}
13
15
  end
14
16
 
17
+ def store_file(file, type=:file)
18
+ key = Time.now.to_i.to_s
19
+ @storage[key] = {type.to_s => Base64.encode64(file)}.to_json
20
+ Response.new "key" => key, "checksum" => 0
21
+ end
22
+
15
23
  def get(key, expected_checksum=nil)
16
24
  if @storage.has_key?(key)
17
25
  {'data' => @storage[key]}
@@ -20,6 +28,15 @@ module NSISam
20
28
  end
21
29
  end
22
30
 
31
+ def get_file(key, type=:file)
32
+ if @storage.has_key?(key)
33
+ response = Hash.new 'data' => Base64.decode64(@storage[key][type.to_s])
34
+ Response.new response
35
+ else
36
+ raise NSISam::Errors::Client::KeyNotFoundError
37
+ end
38
+ end
39
+
23
40
  def delete(key)
24
41
  if @storage.has_key?(key)
25
42
  @storage.delete key
@@ -5,36 +5,49 @@ require "thread"
5
5
 
6
6
  module NSISam
7
7
  class Server < Sinatra::Application
8
+ def storage
9
+ @@storage ||= {}
10
+ end
11
+
12
+ def generate_key
13
+ rand.to_s
14
+ end
8
15
 
9
16
  put "/" do
10
17
  content_type :json
11
18
  incoming = JSON.parse(request.body.read)
12
- {key: "value #{incoming["value"]} stored", checksum: "0"}.to_json
19
+ key = generate_key
20
+ storage[key] = incoming['value']
21
+ { key: key, checksum: "0" }.to_json
13
22
  end
14
23
 
15
24
  get "/" do
16
25
  content_type :json
17
26
  incoming = JSON.parse(request.body.read)
18
- return 404 if incoming["key"].include? "dont"
27
+ key = incoming["key"]
28
+ return 404 unless storage.has_key?(key)
19
29
  {
20
30
  metadata: "this is the metadata",
21
- data: "data for key #{incoming["key"]}"
31
+ data: storage[key]
22
32
  }.to_json
23
33
  end
24
34
 
25
35
  delete "/" do
26
36
  content_type :json
27
37
  incoming = JSON.parse(request.body.read)
28
- return 404 if incoming["key"].include? "dont"
29
- deleted = incoming["key"].include?("delete")
30
- {deleted: deleted}.to_json
38
+ key = incoming["key"]
39
+ return 404 unless storage.has_key?(key)
40
+ storage.delete(key)
41
+ { deleted: true }.to_json
31
42
  end
32
43
 
33
44
  post "/" do
34
45
  content_type :json
35
46
  incoming = JSON.parse(request.body.read)
36
- return 404 if incoming["key"].include? "dont"
37
- {key: incoming["key"], checksum: 0}.to_json
47
+ key = incoming["key"]
48
+ return 404 unless storage.has_key?(key)
49
+ storage[key] = incoming['value']
50
+ { key: key, checksum: 0 }.to_json
38
51
  end
39
52
  end
40
53
 
@@ -0,0 +1,21 @@
1
+ module NSISam
2
+ # @attr [String] key The key of the stored data/file
3
+ # @attr [String] checksum The checksum of the stored data/file
4
+ # @attr [Hash, String, Array] data The stored object
5
+ class Response
6
+ def initialize(hash)
7
+ @key, @checksum, @data, @deleted = hash.values_at(
8
+ 'key', 'checksum', 'data', 'deleted')
9
+ end
10
+
11
+ attr_reader :key, :checksum, :data
12
+
13
+ # Check if some data was deleted sucessfully
14
+ #
15
+ # @return [Boolean] was the object deleted?
16
+ #
17
+ def deleted?
18
+ !!@deleted
19
+ end
20
+ end
21
+ end
data/lib/nsisam.rb CHANGED
@@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/nsisam/configuration'
3
3
  require File.dirname(__FILE__) + '/nsisam/errors'
4
4
  require File.dirname(__FILE__) + '/nsisam/fake_server'
5
5
  require File.dirname(__FILE__) + '/nsisam/fake_client'
6
+ require File.dirname(__FILE__) + '/nsisam/response'
6
7
 
7
8
  module NSISam
8
9
  end
data/nsisam.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "nsisam"
8
- s.version = "0.5.4"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Douglas Camata"]
12
- s.date = "2012-05-30"
12
+ s.date = "2012-08-29"
13
13
  s.description = "A simple gem to access a SAM node. For more info about SAM\n visit www.github.com/nsi-iff/sam_buildout."
14
14
  s.email = "d.camata@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".rspec",
22
+ ".travis.yml",
22
23
  "Gemfile",
23
24
  "LICENSE.txt",
24
25
  "README.rdoc",
@@ -30,16 +31,22 @@ Gem::Specification.new do |s|
30
31
  "lib/nsisam/errors.rb",
31
32
  "lib/nsisam/fake_client.rb",
32
33
  "lib/nsisam/fake_server.rb",
34
+ "lib/nsisam/response.rb",
33
35
  "nsisam.gemspec",
34
36
  "spec/configuration_spec.rb",
35
37
  "spec/fake_client_spec.rb",
38
+ "spec/integration.yml.example",
36
39
  "spec/nsisam_spec.rb",
37
- "spec/spec_helper.rb"
40
+ "spec/response_spec.rb",
41
+ "spec/spec_helper.rb",
42
+ "spec/support/core_extensions.rb",
43
+ "spec/support/files.rb",
44
+ "spec/support/integration.rb"
38
45
  ]
39
46
  s.homepage = "http://github.com/nsi-iff/nsisam-ruby"
40
47
  s.licenses = ["MIT"]
41
48
  s.require_paths = ["lib"]
42
- s.rubygems_version = "1.8.21"
49
+ s.rubygems_version = "1.8.24"
43
50
  s.summary = "A simple gem to access a SAM service."
44
51
 
45
52
  if s.respond_to? :specification_version then
@@ -12,6 +12,13 @@ describe "NSISam::FakeClient" do
12
12
  response.should have_key("checksum")
13
13
  end
14
14
 
15
+ it "can store a file" do
16
+ response = @nsisam.store_file("some file not in base64")
17
+ response.should_not be_nil
18
+ response.key.should_not be_nil
19
+ response.checksum.should_not be_nil
20
+ end
21
+
15
22
  it "can delete a stored value" do
16
23
  resp = @nsisam.store("delete this")
17
24
  response = @nsisam.delete(resp["key"])
@@ -35,6 +42,12 @@ describe "NSISam::FakeClient" do
35
42
  response["data"].should == "retrieve this"
36
43
  end
37
44
 
45
+ it "can retrieve a stored file" do
46
+ resp = @nsisam.store_file("file not in base64")
47
+ response = @nsisam.get_file(resp.key)
48
+ response.data.should_not be_nil
49
+ end
50
+
38
51
  it "can update values in keys already stored" do
39
52
  resp = @nsisam.store("update this")
40
53
  response = @nsisam.update(resp['key'], "updated")
@@ -42,4 +55,4 @@ describe "NSISam::FakeClient" do
42
55
  @nsisam.get(response['key'])['data'].should == "updated"
43
56
  response.should have_key("checksum")
44
57
  end
45
- end
58
+ end
@@ -0,0 +1,4 @@
1
+ user: test
2
+ password: test
3
+ host: localhost
4
+ port: 8888
data/spec/nsisam_spec.rb CHANGED
@@ -1,22 +1,26 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'base64'
2
3
 
3
4
  describe NSISam do
4
-
5
5
  before :all do
6
- @nsisam = NSISam::Client.new user: 'test', password: 'test',
7
- host: 'localhost', port: '8888'
6
+ fake_options = { user: 'test', password: 'test', host: 'localhost',
7
+ port: '8888' }
8
+ @options = integration_options || fake_options
9
+ @nsisam = NSISam::Client.new(@options)
8
10
  @keys = Array.new
9
- @fake_sam = NSISam::FakeServerManager.new.start_server
11
+ @fake_sam = NSISam::FakeServerManager.new.start_server unless integrating?
10
12
  end
11
13
 
12
14
  after :all do
13
- @fake_sam.stop_server
15
+ @fake_sam.stop_server unless integrating?
14
16
  end
15
17
 
18
+ let(:file_content) { example_file_content }
19
+
16
20
  context "cannot connect to server" do
17
21
  it "throws error if couldn't connect to the server" do
18
22
  sam = NSISam::Client.new user: 'test', password: 'test',
19
- host: 'localhost', port: '4000'
23
+ host: 'localhost', port: '4000'
20
24
  expect { sam.store('anything') }.to raise_error(NSISam::Errors::Client::ConnectionRefusedError)
21
25
  end
22
26
  end
@@ -24,17 +28,26 @@ describe NSISam do
24
28
  context "storing" do
25
29
  it "can store a value in SAM" do
26
30
  response = @nsisam.store("something")
27
- response.should_not be_nil
28
- response.should have_key("key")
29
- response.should have_key("checksum")
31
+ response.should respond_to("key")
32
+ response.should respond_to("checksum")
33
+ end
34
+
35
+ context "file" do
36
+ it "encodes content before storing" do
37
+ Base64.should_receive(:encode64).with(file_content).
38
+ and_return(:dummy_value)
39
+ @nsisam.should_receive(:store).with(file: :dummy_value).
40
+ and_return(:dummy_result)
41
+ @nsisam.store_file(file_content).should == :dummy_result
42
+ end
30
43
  end
31
44
  end
32
45
 
33
46
  context "deleting" do
34
47
  it "can delete a stored value" do
35
- @nsisam.store("delete this")["key"].should == 'value delete this stored'
36
- response = @nsisam.delete("delete this")
37
- response["deleted"].should be_true
48
+ key = @nsisam.store("delete this").key
49
+ response = @nsisam.delete(key)
50
+ response.should be_deleted
38
51
  end
39
52
 
40
53
  it "raises error when key not found" do
@@ -44,40 +57,95 @@ describe NSISam do
44
57
 
45
58
  context "retrieving" do
46
59
  it "can retrieve a stored value" do
47
- @nsisam.store("retrieve this")["key"].should == 'value retrieve this stored'
48
- response = @nsisam.get('retrieve this')
49
- response["data"].should == "data for key retrieve this"
60
+ key = @nsisam.store("retrieve this").key
61
+ response = @nsisam.get(key)
62
+ response.data.should == "retrieve this"
50
63
  end
51
64
 
52
65
  it "can retrieve a stored value and automaticly verify its checksum" do
53
- @nsisam.should_receive(:verify_checksum).with('data for key retrieve this', 0).and_return(0)
54
- @nsisam.store("retrieve this")["key"].should == 'value retrieve this stored'
55
- response = @nsisam.get('retrieve this', 0)
56
- response["data"].should == "data for key retrieve this"
66
+ @nsisam.should_receive(:verify_checksum).with('retrieve this', 0).and_return(0)
67
+ key = @nsisam.store("retrieve this").key
68
+ response = @nsisam.get(key, 0)
69
+ response.data.should == "retrieve this"
57
70
  end
58
71
 
59
72
  it "raises errors when expected checksum doesn't match the calculated one" do
60
73
  wrong_checksum = 333
61
- @nsisam.store("retrieve this")["key"].should == 'value retrieve this stored'
62
- expect { @nsisam.get('retrieve this', 333) }.to raise_error(NSISam::Errors::Client::ChecksumMismatchError)
74
+ key = @nsisam.store("retrieve this").key
75
+ expect { @nsisam.get(key, 333) }.to raise_error(NSISam::Errors::Client::ChecksumMismatchError)
63
76
  end
64
77
 
65
78
  it "raises error when key not found" do
66
79
  expect { @nsisam.get("i dont exist") }.to raise_error(NSISam::Errors::Client::KeyNotFoundError)
67
80
  end
81
+
82
+ context 'file' do
83
+ it 'decodes content after retrieving' do
84
+ @nsisam.should_receive(:get).with(:key, nil).
85
+ and_return(stub(key: 'key', checksum: 999,
86
+ data: { 'file' => :dummy_value }, deleted?: true))
87
+ Base64.should_receive(:decode64).with(:dummy_value).
88
+ and_return(:decoded_dummy)
89
+ response = @nsisam.get_file(:key)
90
+ response.data.should == :decoded_dummy
91
+ end
92
+
93
+ it "can generate a direct link to download any file" do
94
+ link = @nsisam.download_link_for_file('some_key')
95
+ link.should == "http://#{@options[:host]}:#{@options[:port]}/file/some_key"
96
+ end
97
+ end
68
98
  end
69
99
 
70
100
  context "updating" do
71
101
  it "can update values in keys already stored" do
72
- @nsisam.store("update this")["key"].should == 'value update this stored'
73
- response = @nsisam.update('update this', "updated")
74
- response["key"].should == 'update this'
75
- response.should have_key("checksum")
102
+ key = @nsisam.store("update this").key
103
+ response = @nsisam.update(key, "updated")
104
+ response.key.should == key
105
+ response.checksum.should_not be_nil
106
+ @nsisam.get(key).data.should == 'updated'
76
107
  end
77
108
 
78
109
  it "raises error when key not found" do
79
110
  expect { @nsisam.update("dont exist ruby is fast", "foo") }.to raise_error(NSISam::Errors::Client::KeyNotFoundError)
80
111
  end
112
+
113
+ context 'file' do
114
+ it 'encodes content before updating' do
115
+ key = @nsisam.store_file(file_content).key
116
+ Base64.should_receive(:encode64).with(:dummy_content).
117
+ and_return(:dummy_content)
118
+ @nsisam.should_receive(:update).with(key, file: :dummy_content).
119
+ and_return(:dummy_result)
120
+ @nsisam.update_file(key, :dummy_content).should == :dummy_result
121
+ end
122
+ end
123
+ end
124
+
125
+ context 'file storage without mocking' do
126
+ it 'stores, retrieves and updates files' do
127
+ updated_file_content = file_content + 'anything ha!'
128
+ key = @nsisam.store_file(file_content).key
129
+ @nsisam.get_file(key).data.should == file_content
130
+ @nsisam.update_file(key, updated_file_content)
131
+ @nsisam.get_file(key).data.should == updated_file_content
132
+ end
133
+
134
+ it 'stores, retrieves and updates documents for other nsi-services' do
135
+ updated_file_content = file_content + 'anything ha!'
136
+ key = @nsisam.store_file(file_content, :doc).key
137
+ @nsisam.get_file(key, :doc).data.should == file_content
138
+ @nsisam.update_file(key, :doc, updated_file_content)
139
+ @nsisam.get_file(key, :doc).data.should == updated_file_content
140
+ end
141
+
142
+ it 'stores, retrieves and updates videos for other nsi-services' do
143
+ updated_file_content = file_content + 'anything ha!'
144
+ key = @nsisam.store_file(file_content, :video).key
145
+ @nsisam.get_file(key, :video).data.should == file_content
146
+ @nsisam.update_file(key, :video, updated_file_content)
147
+ @nsisam.get_file(key, :video).data.should == updated_file_content
148
+ end
81
149
  end
82
150
 
83
151
  context "get configuration" do
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe NSISam::Response do
4
+ let(:response) do
5
+ response = NSISam::Response.new('key' => 'key value',
6
+ 'checksum' => 'checksum value',
7
+ 'data' => 'data value',
8
+ 'deleted' => true)
9
+ end
10
+
11
+ it 'retrieves response data as methods' do
12
+ response.key.should == 'key value'
13
+ response.checksum.should == 'checksum value'
14
+ response.data.should == 'data value'
15
+ end
16
+
17
+ it 'retrieves deleted as boolean method' do
18
+ response.should be_deleted
19
+ NSISam::Response.new('deleted' => false).should_not be_deleted
20
+ end
21
+ end
data/spec/spec_helper.rb CHANGED
@@ -8,5 +8,5 @@ require 'nsisam'
8
8
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
9
 
10
10
  RSpec.configure do |config|
11
-
11
+ config.include NSISam::Test::Helpers
12
12
  end
@@ -0,0 +1,21 @@
1
+ # stolen from active_support 3.2.6 lib/active_support/core_ext/hash/keys.rb
2
+
3
+ class Hash
4
+ # Return a new hash with all keys converted to symbols, as long as
5
+ # they respond to +to_sym+.
6
+ #
7
+ # { 'name' => 'Rob', 'years' => '28' }.symbolize_keys
8
+ # #=> { :name => "Rob", :years => "28" }
9
+ def symbolize_keys
10
+ dup.symbolize_keys!
11
+ end
12
+
13
+ # Destructively convert all keys to symbols, as long as they respond
14
+ # to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
15
+ def symbolize_keys!
16
+ keys.each do |key|
17
+ self[(key.to_sym rescue key) || key] = delete(key)
18
+ end
19
+ self
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'yaml'
2
+
3
+ module NSISam
4
+ module Test
5
+ module Helpers
6
+ def example_file_content
7
+ File.read(__FILE__)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ require 'yaml'
2
+
3
+ module NSISam
4
+ module Test
5
+ module Helpers
6
+ def integration_options
7
+ YAML::load(File.open(config_file)).symbolize_keys if integrating?
8
+ end
9
+
10
+ def integrating?
11
+ ENV['NSI_SAM_INTEGRATION'] && config_file_exists?
12
+ end
13
+
14
+ protected
15
+
16
+ def config_file_exists?
17
+ File.exists?(config_file)
18
+ end
19
+
20
+ def config_file
21
+ File.expand_path(File.join(File.dirname(__FILE__), '..',
22
+ 'integration.yml'))
23
+ end
24
+ end
25
+ end
26
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nsisam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-30 00:00:00.000000000 Z
12
+ date: 2012-08-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -134,6 +134,7 @@ extra_rdoc_files:
134
134
  files:
135
135
  - .document
136
136
  - .rspec
137
+ - .travis.yml
137
138
  - Gemfile
138
139
  - LICENSE.txt
139
140
  - README.rdoc
@@ -145,11 +146,17 @@ files:
145
146
  - lib/nsisam/errors.rb
146
147
  - lib/nsisam/fake_client.rb
147
148
  - lib/nsisam/fake_server.rb
149
+ - lib/nsisam/response.rb
148
150
  - nsisam.gemspec
149
151
  - spec/configuration_spec.rb
150
152
  - spec/fake_client_spec.rb
153
+ - spec/integration.yml.example
151
154
  - spec/nsisam_spec.rb
155
+ - spec/response_spec.rb
152
156
  - spec/spec_helper.rb
157
+ - spec/support/core_extensions.rb
158
+ - spec/support/files.rb
159
+ - spec/support/integration.rb
153
160
  homepage: http://github.com/nsi-iff/nsisam-ruby
154
161
  licenses:
155
162
  - MIT
@@ -165,7 +172,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
172
  version: '0'
166
173
  segments:
167
174
  - 0
168
- hash: -327721087860405445
175
+ hash: 2483391004084390575
169
176
  required_rubygems_version: !ruby/object:Gem::Requirement
170
177
  none: false
171
178
  requirements:
@@ -174,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
181
  version: '0'
175
182
  requirements: []
176
183
  rubyforge_project:
177
- rubygems_version: 1.8.21
184
+ rubygems_version: 1.8.24
178
185
  signing_key:
179
186
  specification_version: 3
180
187
  summary: A simple gem to access a SAM service.