siren_client 0.3.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1d38e18a3d8e7b27a74a1bf4e39a87de411eba9b
4
- data.tar.gz: 533cc402ef1239c82ccdac742caaaf9fb0dff276
3
+ metadata.gz: 0bb4a69b5cf6283d4600e932cdff36f0a6b491c1
4
+ data.tar.gz: cc297a74136cff297fe049b4bfc7f44a3a45b8c7
5
5
  SHA512:
6
- metadata.gz: bc1e058531f13b91a3f043861407bda4a978a55566650a4f00f7de1043b2db8f9f150aba0c0852a47eae4caff867ac6da1888b39491c64fc638cd7e24ab58dd8
7
- data.tar.gz: ee8785bd0cc1ee33529aebe40d2dea9eeee3b84635fb2623935033752296a889f50ac55750c0a5f4c523ef0a95249079867abbd21a7b1a9dedc73980be31a405
6
+ metadata.gz: f78a0a0b758d5c5374e35d4871c895103847e81436f8224f1d2a1009642d6e2a52ec256dfbfe6b70abb10d7de448c8b7a5b87527d84d1936df21aa0f5638399b
7
+ data.tar.gz: 88d809060672563d5e1a7d1daaed24fe005eba79eabc4f1e63bb1328534f5a0a21d0b54ba104d879a6628cb311b8dbf43c537379b6bcb3b2905525b05935039d
@@ -1,11 +1,9 @@
1
- before_install:
2
- - 'if [[ "$TRAVIS_RUBY_VERSION" =~ "jruby" ]]; then rvm get head && rvm reload && rvm use --install $TRAVIS_RUBY_VERSION; fi'
3
1
  language: ruby
4
2
  rvm:
5
- - "1.9.3"
6
- - "2.0.0"
7
- - "2.1.0"
8
- - "2.2.0"
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - 2.2.0
9
7
  - jruby-19mode
10
8
  - jruby-9.0.5.0
11
9
  script: bundle exec rspec
@@ -3,7 +3,6 @@ require "#{dir}/version"
3
3
 
4
4
  # Dependencies
5
5
  require 'json'
6
- require 'logger'
7
6
  require 'httparty'
8
7
  require 'active_support/inflector'
9
8
  require 'active_support/core_ext/hash'
@@ -12,7 +12,7 @@ module SirenClient
12
12
  end
13
13
  @payload = data
14
14
 
15
- @config = { format: :json }.merge config
15
+ @config = { format: :json }.merge config
16
16
  @name = @payload['name'] || ''
17
17
  @classes = @payload['class'] || []
18
18
  @method = (@payload['method'] || 'GET').downcase
@@ -34,17 +34,15 @@ module SirenClient
34
34
  end
35
35
  options[:headers]['Content-Type'] = @type
36
36
  begin
37
- query = options[:query].empty? ? '' : ('?' + options[:query].to_query)
38
- SirenClient.logger.debug "#{@method.upcase} #{@href}#{query}"
39
- options[:headers].each do |k, v|
40
- SirenClient.logger.debug " #{k}: #{v}"
41
- end
42
- SirenClient.logger.debug ' ' + options[:body].to_query unless options[:body].empty?
37
+ resp = generate_raw_response(@method, self.href, options)
43
38
  if next_response_is_raw?
44
39
  disable_raw_response
45
- generate_raw_response(self.href, @config)
40
+ resp
46
41
  else
47
- Entity.new(HTTParty.send(@method.to_sym, @href, options).parsed_response, @config)
42
+ if resp.parsed_response.nil?
43
+ raise InvalidResponseError.new "Response could not be parsed. Code=#{resp.code} Message=\"#{resp.message}\" Body=#{resp.body}"
44
+ end
45
+ Entity.new(resp.parsed_response, @config)
48
46
  end
49
47
  rescue URI::InvalidURIError => e
50
48
  raise InvalidURIError, e.message
@@ -52,5 +50,8 @@ module SirenClient
52
50
  raise InvalidResponseError, e.message
53
51
  end
54
52
  end
53
+ # `.submit` should be used with actions that
54
+ # don't require any parameters, for readability.
55
+ alias_method :submit, :where
55
56
  end
56
57
  end
@@ -1,30 +1,11 @@
1
1
  module SirenClient
2
- # Add a logger that gets passed in from an outside source
3
- # or default to a standard logger. This will allow different
4
- # setups i.e. java logging to log wherever/however they wish.
5
- @@logger = Logger.new(STDOUT)
6
- @@logger.level = Logger::WARN
7
- @@logger.progname = 'SirenClient.' + SirenClient::VERSION
8
- def self.logger; @@logger; end
9
- def self.logger=(log)
10
- unless log.respond_to?(:debug) &&
11
- log.respond_to?(:info) &&
12
- log.respond_to?(:warn) &&
13
- log.respond_to?(:error) &&
14
- log.respond_to?(:fatal)
15
- raise InvalidLogger, "The logger object does not respond to [:debug, :info, :warn, :error, :fatal]."
16
- end
17
- @@logger = log
18
- @@logger.progname = 'SirenClient.' + SirenClient::VERSION
19
- end
20
-
21
2
  def self.get(options)
22
3
  if options.is_a? String
23
4
  Entity.new(options)
24
5
  elsif options.is_a? Hash
25
6
  url = options[:url] || options['url']
26
7
  raise ArgumentError, "You must supply a valid url to SirenClient.get" unless url
27
- Entity.new(url, options)
8
+ Entity.new(url, options)
28
9
  else
29
10
  raise ArgumentError, 'You must supply either a string or hash to SirenClient.get'
30
11
  end
@@ -16,8 +16,11 @@ module SirenClient
16
16
  raise InvalidURIError, 'An invalid url was passed to SirenClient::Entity.new.'
17
17
  end
18
18
  begin
19
- SirenClient.logger.debug "GET #{data}"
20
- @payload = HTTParty.get(data, @config).parsed_response
19
+ resp = generate_raw_response(:get, data, @config)
20
+ if resp.parsed_response.nil?
21
+ raise InvalidResponseError.new "Response could not be parsed. Code=#{resp.code} Message=\"#{resp.message}\" Body=#{resp.body}"
22
+ end
23
+ @payload = resp.parsed_response
21
24
  rescue URI::InvalidURIError => e
22
25
  raise InvalidURIError, e.message
23
26
  rescue JSON::ParserError => e
@@ -39,8 +42,8 @@ module SirenClient
39
42
  else
40
43
  if next_response_is_raw?
41
44
  disable_raw_response
42
- @entities[i].with_raw_response.go
43
- else
45
+ @entities[i].with_raw_response.go
46
+ else
44
47
  @entities[i].go
45
48
  end
46
49
  end
@@ -72,7 +75,7 @@ module SirenClient
72
75
  return if self.href.empty?
73
76
  if next_response_is_raw?
74
77
  disable_raw_response
75
- generate_raw_response(self.href, @config)
78
+ generate_raw_response(:get, self.href, @config)
76
79
  else
77
80
  self.class.new(self.href, @config)
78
81
  end
@@ -103,7 +106,7 @@ module SirenClient
103
106
  disable_raw_response
104
107
  return link.with_raw_response.go
105
108
  else
106
- return link.go
109
+ return link.go
107
110
  end
108
111
  end
109
112
  end
@@ -2,5 +2,4 @@ module SirenClient
2
2
  class StandardError < ::StandardError; end
3
3
  class InvalidURIError < StandardError; end
4
4
  class InvalidResponseError < StandardError; end
5
- class InvalidLogger < StandardError; end
6
5
  end
@@ -4,14 +4,14 @@ module SirenClient
4
4
 
5
5
  attr_accessor :href
6
6
  attr_reader :payload, :rels, :title, :type, :config
7
-
7
+
8
8
  def initialize(data, config={})
9
9
  super()
10
10
  if data.class != Hash
11
11
  raise ArgumentError, "You must pass in a Hash to SirenClient::Link.new"
12
12
  end
13
13
  @payload = data
14
- @config = { format: :json }.merge config
14
+ @config = { format: :json }.merge config
15
15
 
16
16
  @rels = @payload['rel'] || []
17
17
  @href = @payload['href'] || ''
@@ -22,7 +22,7 @@ module SirenClient
22
22
  def go
23
23
  if next_response_is_raw?
24
24
  disable_raw_response
25
- generate_raw_response(self.href, @config)
25
+ generate_raw_response(:get, self.href, @config)
26
26
  else
27
27
  Entity.new(self.href, @config)
28
28
  end
@@ -18,10 +18,10 @@ module SirenClient
18
18
  @_next_response_is_raw
19
19
  end
20
20
 
21
- private
21
+ private
22
22
 
23
- def generate_raw_response(url, config)
24
- RawResponse.new HTTParty.get(url, config)
23
+ def generate_raw_response(method, url, config)
24
+ RawResponse.new HTTParty.send(method.to_sym, url, config)
25
25
  end
26
26
  end
27
27
  end
@@ -1,5 +1,7 @@
1
1
  module SirenClient
2
2
  class RawResponse
3
+ attr_accessor :response
4
+
3
5
  def initialize(http_res)
4
6
  unless http_res.class == HTTParty::Response
5
7
  raise InvalidResponseError, "SirenClient::RawResponse expects a HTTParty::Response instance."
@@ -7,8 +9,12 @@ module SirenClient
7
9
  @response = http_res
8
10
  end
9
11
 
12
+ def parsed_response
13
+ @response.parsed_response
14
+ end
15
+
10
16
  def body
11
- @response.body
17
+ @response.body
12
18
  end
13
19
 
14
20
  def code
@@ -1,3 +1,3 @@
1
1
  module SirenClient
2
- VERSION = "0.3.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  describe SirenClient do
14
14
  context 'when creating an entity' do
15
- let (:headers_ent) {
15
+ let (:headers_ent) {
16
16
  SirenClient.get({
17
17
  url: URL,
18
18
  basic_auth: { username: 'admin', password: '1234' },
@@ -22,7 +22,7 @@ describe SirenClient do
22
22
  it 'can set HTTP headers' do
23
23
  expect {
24
24
  expect(headers_ent.config[:headers]).to be_a Hash
25
- expect(headers_ent.config[:headers]).to eq({
25
+ expect(headers_ent.config[:headers]).to eq({
26
26
  "Accept" => "application/json"
27
27
  })
28
28
  }.to_not raise_error
@@ -34,14 +34,14 @@ describe SirenClient do
34
34
  end
35
35
  end
36
36
 
37
- let (:client) {
37
+ let (:client) {
38
38
 
39
39
  SirenClient.get(
40
- url: URL,
40
+ url: URL,
41
41
  timeout: 2,
42
42
  basic_auth: { username: 'admin', password: '1234' },
43
43
  headers: { "Accept" => "application/json" }
44
- )
44
+ )
45
45
  }
46
46
  context 'when accessing the root entity' do
47
47
  it 'to return an entity' do
@@ -97,6 +97,21 @@ describe SirenClient do
97
97
  end
98
98
  end
99
99
  end
100
+ context 'when executing an action with DELETE' do
101
+ it 'returns a siren response' do
102
+ expect(client.delete_concept.where(id: 1)).to be_a SirenClient::Entity
103
+ end
104
+ end
105
+ # Typically this will be called directly on a resource
106
+ # without any additional parameters.
107
+ context 'when executing a `text/plain` action' do
108
+ it 'returns a 404 without the body being set correctly' do
109
+ expect { client.messages[0].update_message.submit }.to raise_error(/Code=404/)
110
+ end
111
+ it 'returns a siren response' do
112
+ expect(client.messages[0].update_message.where('this is the new message')).to be_a SirenClient::Entity
113
+ end
114
+ end
100
115
 
101
116
  let (:concepts) { SirenClient.get({ url: URL, basic_auth: { username: 'admin', password: '1234' }}).concepts }
102
117
  context 'when accessing an entity' do
@@ -123,6 +138,11 @@ describe SirenClient do
123
138
  client.filter_concepts_get.with_raw_response.where(params)
124
139
  expect(client.concepts).to be_a SirenClient::Entity
125
140
  end
141
+ it 'to return the correct concept' do
142
+ concepts_raw = client.filter_concepts_get.with_raw_response.where(params)
143
+ expect(concepts_raw.body).to match(/"count": 1/)
144
+ expect(concepts_raw.body).to match(/("text":"barack obama"){1}/)
145
+ end
126
146
  end
127
147
  it 'to provide the raw body' do
128
148
  expect(client.with_raw_response.concepts.body).to eq(HTTParty.get(URL + '/concepts', basic_auth: { username: 'admin', password: '1234' }).body)
@@ -1,14 +1,15 @@
1
1
  class TestServer < Sinatra::Base
2
2
  CON_1 = <<-EOF
3
- {
3
+ {
4
4
  "class":["concepts"],
5
5
  "rel":["/rels/concepts"],
6
- "properties":{
6
+ "properties":{
7
+ "id": 1,
7
8
  "text":"barack obama",
8
9
  "category":"PERSON"
9
10
  },
10
- "links":[
11
- {
11
+ "links":[
12
+ {
12
13
  "rel":["self"],
13
14
  "href":"#{@@url}/concepts/1"
14
15
  }
@@ -16,15 +17,16 @@ class TestServer < Sinatra::Base
16
17
  }
17
18
  EOF
18
19
  CON_2 = <<-EOF
19
- {
20
+ {
20
21
  "class":["concepts"],
21
22
  "rel":["/rels/concepts"],
22
- "properties":{
23
+ "properties":{
24
+ "id": 2,
23
25
  "text":"tennessee",
24
26
  "category":"LOCATION"
25
27
  },
26
- "links":[
27
- {
28
+ "links":[
29
+ {
28
30
  "rel":["self"],
29
31
  "href":"#{@@url}/concepts/2"
30
32
  }
@@ -47,6 +49,14 @@ class TestServer < Sinatra::Base
47
49
  }
48
50
  EOF
49
51
  end
52
+ delete '/concepts/?' do
53
+ <<-EOF
54
+ {
55
+ "class":["status"],
56
+ "properties": { "success": true }
57
+ }
58
+ EOF
59
+ end
50
60
  get '/concepts/?' do
51
61
  query = (request.query_string.length > 0 ? '?' : '') + request.query_string
52
62
  # search=obama
@@ -66,14 +76,14 @@ class TestServer < Sinatra::Base
66
76
  EOF
67
77
  else
68
78
  <<-EOF
69
- {
79
+ {
70
80
  "class":["concepts","collection"],
71
- "properties":{
81
+ "properties":{
72
82
  "count":2
73
83
  },
74
84
  "entities":[#{CON_1}, #{CON_2}],
75
- "links":[
76
- {
85
+ "links":[
86
+ {
77
87
  "rel":["self"],
78
88
  "href":"#{@@url}/concepts#{query}"
79
89
  }
@@ -0,0 +1,73 @@
1
+ class TestServer < Sinatra::Base
2
+ MSG_1 = <<-EOF
3
+ {
4
+ "class":["messages"],
5
+ "rel":["/rels/messages"],
6
+ "properties":{
7
+ "id": 1,
8
+ "text":"This is message one"
9
+ },
10
+ "links":[
11
+ {
12
+ "rel":["self"],
13
+ "href":"#{@@url}/messages/1"
14
+ }
15
+ ],
16
+ "actions": [{
17
+ "name": "update message",
18
+ "method": "PUT",
19
+ "href": "#{@@url}/messages/1",
20
+ "title": "Update the text of the message",
21
+ "type": "text/plain"
22
+ }]
23
+ }
24
+ EOF
25
+ MSG_2 = <<-EOF
26
+ {
27
+ "class":["messages"],
28
+ "rel":["/rels/messages"],
29
+ "properties":{
30
+ "id": 2,
31
+ "text":"This is message two"
32
+ },
33
+ "links":[
34
+ {
35
+ "rel":["self"],
36
+ "href":"#{@@url}/messages/2"
37
+ }
38
+ ],
39
+ "actions": [{
40
+ "name": "update message",
41
+ "method": "PUT",
42
+ "href": "#{@@url}/messages/2",
43
+ "title": "Update the text of the message",
44
+ "type": "text/plain"
45
+ }]
46
+ }
47
+ EOF
48
+ put '/messages/:id' do
49
+ if request.content_type == 'text/plain' &&
50
+ request.body.read == 'this is the new message'
51
+ MSG_1
52
+ else
53
+ halt 404
54
+ end
55
+ end
56
+ get '/messages/?' do
57
+ <<-EOF
58
+ {
59
+ "class":["messages","collection"],
60
+ "properties":{
61
+ "count":2
62
+ },
63
+ "entities":[#{MSG_1}, #{MSG_2}],
64
+ "links":[
65
+ {
66
+ "rel":["self"],
67
+ "href":"#{@@url}/messages"
68
+ }
69
+ ]
70
+ }
71
+ EOF
72
+ end
73
+ end
@@ -12,12 +12,12 @@ class TestServer < Sinatra::Base
12
12
  "href":"#{@@url}/"
13
13
  },
14
14
  {
15
- "rel": ["collection", "concepts"],
15
+ "rel": ["collection", "concepts"],
16
16
  "href":"#{@@url}/concepts",
17
17
  "title": "Concepts"
18
18
  },
19
19
  {
20
- "rel": ["collection", "concepts with spaces"],
20
+ "rel": ["collection", "concepts with spaces"],
21
21
  "href":"#{@@url}/concepts",
22
22
  "title": "Concepts"
23
23
  },
@@ -26,80 +26,68 @@ class TestServer < Sinatra::Base
26
26
  "title":"Messages"
27
27
  }
28
28
  ],
29
- "actions": [
30
- {
29
+ "actions": [
30
+ {
31
31
  "name":"filter-concepts-get",
32
32
  "method":"GET",
33
33
  "href":"#{@@url}/concepts",
34
34
  "title":"Get an optionally filtered list of Concepts",
35
35
  "type":"application/x-www-form-urlencoded",
36
- "fields":[
37
- {
36
+ "fields":[
37
+ {
38
38
  "name":"limit",
39
39
  "title":"Max number of results in each page",
40
40
  "type":"number"
41
41
  },
42
- {
42
+ {
43
43
  "name":"page",
44
44
  "title":"Page number, starting at 1",
45
45
  "type":"number"
46
46
  },
47
- {
47
+ {
48
48
  "name":"search",
49
49
  "title":"Keyword search on concept text",
50
50
  "type":"text"
51
51
  }
52
52
  ]
53
53
  },
54
- {
54
+ {
55
+ "name": "delete-concept",
56
+ "method": "DELETE",
57
+ "href": "#{@@url}/concepts",
58
+ "title": "Delete a concept",
59
+ "type": "application/x-www-form-urlencoded",
60
+ "fields": [{
61
+ "name": "id",
62
+ "title": "ID of the concept to delete.",
63
+ "type": "text"
64
+ }]
65
+ },
66
+ {
55
67
  "name":"filter-concepts-post",
56
68
  "method":"POST",
57
69
  "href":"#{@@url}/concepts",
58
70
  "title":"Get an optionally filtered list of Concepts",
59
71
  "type":"application/x-www-form-urlencoded",
60
- "fields":[
61
- {
72
+ "fields":[
73
+ {
62
74
  "name":"limit",
63
75
  "title":"Max number of results in each page",
64
76
  "type":"number"
65
77
  },
66
- {
78
+ {
67
79
  "name":"page",
68
80
  "title":"Page number, starting at 1",
69
81
  "type":"number"
70
82
  },
71
- {
83
+ {
72
84
  "name":"search",
73
85
  "title":"Keyword search on concept text",
74
86
  "type":"text"
75
87
  }
76
88
  ]
77
89
  },
78
- { "name": "filter concepts post with spaces" },
79
- {
80
- "name":"filter-messages",
81
- "method":"GET",
82
- "href":"#{@@url}/messages",
83
- "title":"Get an optionally filtered list of Messages",
84
- "type":"application/x-www-form-urlencoded",
85
- "fields":[
86
- {
87
- "name":"limit",
88
- "title":"Max number of results in each page",
89
- "type":"number"
90
- },
91
- {
92
- "name":"page",
93
- "title":"Page number, starting at 1",
94
- "type":"number"
95
- },
96
- {
97
- "name":"search",
98
- "title":"Keyword search on message body",
99
- "type":"number"
100
- }
101
- ]
102
- }
90
+ { "name": "filter concepts post with spaces" }
103
91
  ]
104
92
  }
105
93
  EOF
@@ -2,6 +2,8 @@ require 'helper/spec_helper'
2
2
 
3
3
  describe SirenClient::Action do
4
4
  let (:action_data) { {"name"=>"search","method"=>"GET","href"=>"http://example.com/products","fields"=>[{"name"=>"search","type"=>"text"}]} }
5
+ let (:action_data_post) { {"name"=>"search","method"=>"POST","href"=>"http://example.com/products","fields"=>[{"name"=>"search","type"=>"text"}]} }
6
+ let (:action_data_delete) { {"name"=>"delete","method"=>"DELETE","href"=>"http://example.com/products"} }
5
7
 
6
8
  describe '.new(data)' do
7
9
  it 'raise an error if wrong type is provided' do
@@ -12,11 +14,17 @@ describe SirenClient::Action do
12
14
  end
13
15
  end
14
16
 
15
- let (:action) {
16
- SirenClient::Action.new(action_data, {
17
- headers: { "Accept" => "application/json" }
17
+ let (:action) {
18
+ SirenClient::Action.new(action_data, {
19
+ headers: { "Accept" => "application/json" }
18
20
  })
19
21
  }
22
+ let (:action_post) {
23
+ SirenClient::Action.new(action_data_post)
24
+ }
25
+ let (:action_delete) {
26
+ SirenClient::Action.new(action_data_delete)
27
+ }
20
28
  describe '.config' do
21
29
  it 'is a hash' do
22
30
  expect(action.config).to be_a Hash
@@ -81,10 +89,22 @@ describe SirenClient::Action do
81
89
  end
82
90
  end
83
91
  describe '.where(params)' do
84
- it 'executes the action without any parameters' do
92
+ it 'executes the GET action' do
93
+ # I'm expecting an error here, all I want to see is that the url it being traversed.
94
+ expect { action.where(test: 'hi') }.to raise_error SirenClient::InvalidResponseError
95
+ end
96
+ it 'executes the POST action' do
85
97
  # I'm expecting an error here, all I want to see is that the url it being traversed.
86
- expect { action.where }.to raise_error SirenClient::InvalidResponseError
98
+ expect { action_post.where(test: 'hi') }.to raise_error SirenClient::InvalidResponseError
99
+ end
100
+ it 'executes the DELETE action' do
101
+ expect { action_delete.submit }.to raise_error SirenClient::InvalidResponseError
87
102
  end
88
103
  # The rest will be tested in the live specs.
89
104
  end
105
+ describe '.submit' do
106
+ it 'executes the action without any parameters' do
107
+ expect { action.submit }.to raise_error SirenClient::InvalidResponseError
108
+ end
109
+ end
90
110
  end
@@ -9,7 +9,7 @@ describe SirenClient do
9
9
  expect { SirenClient.get }.to raise_error(ArgumentError)
10
10
  end
11
11
  it "raise an error if an improper param is provided" do
12
- expect { SirenClient.get([1, 2, 3]) }.to raise_error(ArgumentError, invalid_param_msg)
12
+ expect { SirenClient.get([1, 2, 3]) }.to raise_error(ArgumentError, invalid_param_msg)
13
13
  expect { SirenClient.get(nil) }.to raise_error(ArgumentError, invalid_param_msg)
14
14
  end
15
15
  it "raise an error if no url is provided" do
@@ -22,31 +22,5 @@ describe SirenClient do
22
22
  expect { SirenClient.get('http://google.com') }.to raise_error(SirenClient::InvalidResponseError)
23
23
  end
24
24
  end
25
- describe '.logger(before)' do
26
- it 'is a standard ruby logger instance' do
27
- expect(SirenClient.logger).to be_a Logger
28
- end
29
- end
30
- describe '.logger=' do
31
- it 'raise an error if it does not respect the logger interface' do
32
- expect { SirenClient.logger = "error" }.to raise_error SirenClient::InvalidLogger
33
- end
34
- it 'accepts an instance that respects the logger interface' do
35
- SirenClient.logger = Logger.new(STDOUT)
36
- SirenClient.logger.level = Logger::WARN
37
- expect(SirenClient.logger).to be_a Logger
38
- end
39
- end
40
- describe '.logger(after)' do
41
- it 'responds to .info(str)' do
42
- expect(SirenClient.logger.respond_to?(:info)).to eq(true)
43
- end
44
- it 'responds to .warn(str)' do
45
- expect(SirenClient.logger.respond_to?(:warn)).to eq(true)
46
- end
47
- it 'responds to .error(str)' do
48
- expect(SirenClient.logger.respond_to?(:error)).to eq(true)
49
- end
50
- end
51
25
  # Remainder will be tested in live spec
52
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: siren_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chason Choate
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-16 00:00:00.000000000 Z
11
+ date: 2016-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -198,6 +198,7 @@ files:
198
198
  - spec/helper/spec_helper.rb
199
199
  - spec/live/traverse_spec.rb
200
200
  - spec/support/endpoints/concepts.rb
201
+ - spec/support/endpoints/messages.rb
201
202
  - spec/support/endpoints/root.rb
202
203
  - spec/support/test_server.rb
203
204
  - spec/unit/action_spec.rb
@@ -226,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
227
  version: '0'
227
228
  requirements: []
228
229
  rubyforge_project:
229
- rubygems_version: 2.5.1
230
+ rubygems_version: 2.4.8
230
231
  signing_key:
231
232
  specification_version: 4
232
233
  summary: A client to traverse Siren APIs https://github.com/kevinswiber/siren
@@ -235,6 +236,7 @@ test_files:
235
236
  - spec/helper/spec_helper.rb
236
237
  - spec/live/traverse_spec.rb
237
238
  - spec/support/endpoints/concepts.rb
239
+ - spec/support/endpoints/messages.rb
238
240
  - spec/support/endpoints/root.rb
239
241
  - spec/support/test_server.rb
240
242
  - spec/unit/action_spec.rb