braque 0.1.5 → 0.1.7

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: a4c1ebc21906dfa95cf2c91d86d5280cb674798e
4
- data.tar.gz: 21240b5b4080d20712490a9be9f2f8785e2a7fd3
3
+ metadata.gz: 117d19be143c1b7314093816acc359f136666c06
4
+ data.tar.gz: abb1836ab553182c46553ea2578fb530c5b018be
5
5
  SHA512:
6
- metadata.gz: e75f45268a9392bbaf483483d779e9e7f25467cf9bb18f70cd7da537e76cb10c176be63c82d87f8e80863be1d442a5b013d532ea87f9de96ea3bbcee0517f54c
7
- data.tar.gz: 50a7a00106e3e8c6b5b723aee03ec9f3060ac619442d2a891de756a67d2ce6cdbd66cd6f8f39e2e6c822676837f3edd97bd8b686487cf823fcdd709350b01d03
6
+ metadata.gz: 54f0b02909ea21b7345b5718ba90738c24a7a613a6d77b346b606f5eb87e81218972a1e64f869429ae176a906c6c5bf2fe1eaaef7be1087fc030583c11f51534
7
+ data.tar.gz: b6959ce75f02e30fb785896ebb8fd43c70dac27eb0a8b614f3d8edebe8fa74227d248e23688b14dad4939135dcba5c2d8dc718dfc70a8d06a6f6a94fe347ae76
data/README.md CHANGED
@@ -13,7 +13,7 @@ Braque is an early-stage and exploratory project. That said, at [Artsy](https://
13
13
  ```ruby
14
14
  class Article
15
15
  include Braque::Model
16
- self.api_root = Rails.application.config_for(:articles_service)['url']
16
+ api_root_url Rails.application.config_for(:articles_service)['url']
17
17
 
18
18
  attribute :id
19
19
  attribute :title
@@ -33,8 +33,8 @@ For example, `http_authorization_header` credentials defined here are added to t
33
33
  ```ruby
34
34
  class Article
35
35
  include Braque::Model
36
- self.api_root = Rails.application.config_for(:articles_service)['url']
37
- self.http_authorization_header = Rails.application.config_for(:articles_service)['token']
36
+ api_root_url Rails.application.config_for(:articles_service)['url']
37
+ http_authorization_header Rails.application.config_for(:articles_service)['token']
38
38
 
39
39
  attribute :id
40
40
  attribute :title
@@ -46,8 +46,8 @@ Defining an `accept_header` credential will replace Hyperclient's default `Accep
46
46
  ```ruby
47
47
  class Article
48
48
  include Braque::Model
49
- self.api_root = Rails.application.config_for(:articles_service)['url']
50
- self.accept_header = Rails.application.config_for(:articles_service)['accept_header']
49
+ api_root_url Rails.application.config_for(:articles_service)['url']
50
+ accept_header Rails.application.config_for(:articles_service)['accept_header']
51
51
 
52
52
  attribute :id
53
53
  attribute :title
@@ -6,9 +6,9 @@ module Braque
6
6
  resource_path_options = options[:resource_path] || '{id}'
7
7
  root_hash = {}
8
8
  root_hash[:_links] = {}
9
- root_hash[:_links][:self] = { href: hyperclient_model_class.api_root }
10
- root_hash[:_links][hyperclient_model_class.collection_method_name] = { href: "#{hyperclient_model_class.api_root}/#{hyperclient_model_class.collection_method_name}#{collection_query_options}", templated: true }
11
- root_hash[:_links][hyperclient_model_class.instance_method_name] = { href: "#{hyperclient_model_class.api_root}/#{hyperclient_model_class.collection_method_name}/#{resource_path_options}", templated: true }
9
+ root_hash[:_links][:self] = { href: hyperclient_model_class.config[:api_root_url] }
10
+ root_hash[:_links][hyperclient_model_class.collection_method_name] = { href: "#{hyperclient_model_class.config[:api_root_url]}/#{hyperclient_model_class.collection_method_name}#{collection_query_options}", templated: true }
11
+ root_hash[:_links][hyperclient_model_class.instance_method_name] = { href: "#{hyperclient_model_class.config[:api_root_url]}/#{hyperclient_model_class.collection_method_name}/#{resource_path_options}", templated: true }
12
12
  JSON.parse root_hash.to_json
13
13
  end
14
14
 
@@ -19,9 +19,9 @@ module Braque
19
19
  collection_hash[:total_pages] = 1
20
20
  collection_hash[:current_page] = 1
21
21
  collection_hash[:_links] = {}
22
- collection_hash[:_links][:self] = { href: "#{hyperclient_model.class.api_root}/#{hyperclient_model.class.collection_method_name}" }
23
- collection_hash[:_links][:next] = { href: "#{hyperclient_model.class.api_root}/#{hyperclient_model.class.collection_method_name}" }
24
- collection_hash[:_links][:prev] = { href: "#{hyperclient_model.class.api_root}/#{hyperclient_model.class.collection_method_name}" }
22
+ collection_hash[:_links][:self] = { href: "#{hyperclient_model.class.config[:api_root_url]}/#{hyperclient_model.class.collection_method_name}" }
23
+ collection_hash[:_links][:next] = { href: "#{hyperclient_model.class.config[:api_root_url]}/#{hyperclient_model.class.collection_method_name}" }
24
+ collection_hash[:_links][:prev] = { href: "#{hyperclient_model.class.config[:api_root_url]}/#{hyperclient_model.class.collection_method_name}" }
25
25
  collection_hash[:_embedded] = {}
26
26
  collection_hash[:_embedded][hyperclient_model.class.collection_method_name] = embedded_elements_for_collection(hyperclient_model_collection, options)
27
27
  JSON.parse collection_hash.to_json
@@ -44,11 +44,11 @@ module Braque
44
44
  resource_path_str = eval(options[:resource_path].to_s) if options[:resource_path]
45
45
  resource_path = resource_path_str || model.id
46
46
  hyperclient_element = {}
47
- model.attributes.keys.each do |key|
47
+ model.attributes.each_key do |key|
48
48
  hyperclient_element[key] = model.send(key)
49
49
  end
50
50
  hyperclient_element[:_links] = {}
51
- hyperclient_element[:_links][:self] = { href: "#{model.class.api_root}/#{model.class.collection_method_name}/#{resource_path}" }
51
+ hyperclient_element[:_links][:self] = { href: "#{model.class.config[:api_root_url]}/#{model.class.collection_method_name}/#{resource_path}" }
52
52
  hyperclient_element
53
53
  end
54
54
  end
data/lib/braque/model.rb CHANGED
@@ -4,12 +4,8 @@ module Braque
4
4
  include ::ActiveAttr::Model
5
5
 
6
6
  included do
7
- # NOTE: This adds class attributes to Braque::Model that will be
8
- # used to set up Hyperclient in the client method.
9
- #
10
- [:api_root, :accept_header, :authorization_header, :http_authorization_header].each do |sym|
11
- class_attribute sym
12
- end
7
+ class_attribute :config
8
+ self.config = {}
13
9
 
14
10
  # NOTE: This assumes that the related API uses an ID attribute to
15
11
  # define the resource. Rails will use this field to construct
@@ -19,6 +15,7 @@ module Braque
19
15
  # in client apps if some other scheme is more advisable.
20
16
  #
21
17
  def to_param
18
+ fail 'Please overide to_param or add id to your model attributes.' unless attributes.include? 'id'
22
19
  id.to_s
23
20
  end
24
21
 
@@ -30,6 +27,7 @@ module Braque
30
27
  # classes in client apps if some other scheme is more advisable.
31
28
  #
32
29
  def resource_find_options
30
+ fail 'Please overide resource_find_options or add id to your model attributes.' unless attributes.include? 'id'
33
31
  { id: id }
34
32
  end
35
33
 
@@ -52,6 +50,8 @@ module Braque
52
50
 
53
51
  def self.inherited(subclass)
54
52
  subclass.class_eval do
53
+ self.config = self.config.dup
54
+
55
55
  define_singleton_method subclass.instance_method_name do
56
56
  end
57
57
 
@@ -65,6 +65,12 @@ module Braque
65
65
  module ClassMethods
66
66
  include Braque::Collection
67
67
 
68
+ [:api_root_url, :accept_header, :authorization_header, :http_authorization_header].each do |config_option|
69
+ define_method config_option do |value|
70
+ config[config_option] = value
71
+ end
72
+ end
73
+
68
74
  def list(options = {})
69
75
  options = Hash[options.map { |k, v| [CGI.escape(k.to_s), v] }]
70
76
  response = client.method(collection_method_name).call(options)
@@ -77,7 +83,8 @@ module Braque
77
83
  end
78
84
 
79
85
  def create(params = {})
80
- response = client.method(collection_method_name).call._post("#{instance_method_name}" => params)
86
+ response = client.method(collection_method_name).call
87
+ ._post("#{instance_method_name}" => params)
81
88
  new response
82
89
  end
83
90
 
@@ -90,10 +97,11 @@ module Braque
90
97
  end
91
98
 
92
99
  def client
93
- Hyperclient.new(api_root) do |client|
94
- client.headers['Http-Authorization'] = http_authorization_header if http_authorization_header
95
- client.headers['Authorization'] = authorization_header if authorization_header
96
- client.headers['Accept'] = accept_header if accept_header
100
+ fail 'Please define api_root for all Braque::Model classes' unless config[:api_root_url]
101
+ Hyperclient.new(config[:api_root_url]) do |client|
102
+ client.headers['Http-Authorization'] = config[:http_authorization_header] if config[:http_authorization_header]
103
+ client.headers['Authorization'] = config[:authorization_header] if config[:authorization_header]
104
+ client.headers['Accept'] = config[:accept_header] if config[:accept_header]
97
105
  end
98
106
  end
99
107
  end
@@ -1,3 +1,3 @@
1
1
  module Braque
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'api_root' do
4
+ context 'with a Braque::Model class that does not define api_root' do
5
+ class Rodinia
6
+ include ::Braque::Model
7
+ end
8
+
9
+ it 'raises an error' do
10
+ expect { Rodinia.client }.to raise_error(
11
+ RuntimeError, 'Please define api_root for all Braque::Model classes'
12
+ )
13
+ end
14
+ end
15
+
16
+ context 'with a Braque::Model class that defines api_root' do
17
+ class Magma
18
+ include ::Braque::Model
19
+ api_root_url 'http://localhost:9292'
20
+ end
21
+
22
+ it 'does not raise an error' do
23
+ expect { Magma.client }.to_not raise_error
24
+ end
25
+ end
26
+ end
@@ -10,15 +10,15 @@ RSpec.describe 'Hyperclient header configuration' do
10
10
  context 'with a Braque::Model class that defines an api token' do
11
11
  class Mantle
12
12
  include ::Braque::Model
13
- self.api_root = 'http://localhost:9292'
14
- self.http_authorization_header = 'replace-me'
13
+ api_root_url 'http://localhost:9292'
14
+ http_authorization_header 'replace-me'
15
15
  end
16
16
 
17
17
  it 'passes http_authorization_header via Http-Authorization headers with requests' do
18
18
  Mantle.client._get
19
19
  expect(
20
20
  root_request
21
- .with(headers: { 'Http-Authorization' => Mantle.http_authorization_header })
21
+ .with(headers: { 'Http-Authorization' => Mantle.config[:http_authorization_header] })
22
22
  ).to have_been_requested
23
23
  end
24
24
 
@@ -34,8 +34,8 @@ RSpec.describe 'Hyperclient header configuration' do
34
34
  context 'with a Braque::Model class that defines an accept_header' do
35
35
  class Subduction
36
36
  include ::Braque::Model
37
- self.api_root = 'http://localhost:9292'
38
- self.accept_header = 'application/vnd.earth-v1+json'
37
+ api_root_url 'http://localhost:9292'
38
+ accept_header 'application/vnd.earth-v1+json'
39
39
  end
40
40
 
41
41
  it 'includes class defined accept_header with request headers' do
@@ -50,15 +50,15 @@ RSpec.describe 'Hyperclient header configuration' do
50
50
  context 'with a Braque::Model class that defines an authorization header' do
51
51
  class Lithoshpere
52
52
  include ::Braque::Model
53
- self.api_root = 'http://localhost:9292'
54
- self.authorization_header = 'Farallon Plate'
53
+ api_root_url 'http://localhost:9292'
54
+ authorization_header 'Farallon Plate'
55
55
  end
56
56
 
57
57
  it 'includes correct Authorization header with request headers' do
58
58
  Lithoshpere.client._get
59
59
  expect(
60
60
  root_request
61
- .with(headers: { 'Authorization' => Lithoshpere.authorization_header })
61
+ .with(headers: { 'Authorization' => Lithoshpere.config[:authorization_header] })
62
62
  ).to have_been_requested
63
63
  end
64
64
  end
@@ -10,8 +10,8 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
10
10
  before(:all) do
11
11
  class Article
12
12
  include ::Braque::Model
13
- self.api_root = 'http://localhost:9292'
14
- self.http_authorization_header = 'replace-me'
13
+ api_root_url 'http://localhost:9292'
14
+ http_authorization_header 'replace-me'
15
15
  attribute :id
16
16
  attribute :title
17
17
  attribute :key
@@ -25,15 +25,15 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
25
25
  end
26
26
 
27
27
  it 'returns the self link' do
28
- expect(@root_json['_links']['self']['href']).to eq Article.api_root
28
+ expect(@root_json['_links']['self']['href']).to eq Article.config[:api_root_url]
29
29
  end
30
30
 
31
31
  it 'returns the collection link' do
32
- expect(@root_json['_links']['articles']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}{?page,size}"
32
+ expect(@root_json['_links']['articles']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}{?page,size}"
33
33
  end
34
34
 
35
35
  it 'returns the resource link' do
36
- expect(@root_json['_links']['article']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}/{id}"
36
+ expect(@root_json['_links']['article']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}/{id}"
37
37
  end
38
38
  end
39
39
  context 'options' do
@@ -42,15 +42,15 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
42
42
  end
43
43
 
44
44
  it 'returns the self link' do
45
- expect(@root_json['_links']['self']['href']).to eq Article.api_root
45
+ expect(@root_json['_links']['self']['href']).to eq Article.config[:api_root_url]
46
46
  end
47
47
 
48
48
  it 'returns the collection link using the collection_query option' do
49
- expect(@root_json['_links']['articles']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}{?page}"
49
+ expect(@root_json['_links']['articles']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}{?page}"
50
50
  end
51
51
 
52
52
  it 'returns the resource link using the resource_path option' do
53
- expect(@root_json['_links']['article']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}/{id}?key={key}"
53
+ expect(@root_json['_links']['article']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}/{id}?key={key}"
54
54
  end
55
55
  end
56
56
  end
@@ -62,13 +62,13 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
62
62
  end
63
63
 
64
64
  it 'returns the _links node' do
65
- expect(@collection_json['_links']['self']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}"
66
- expect(@collection_json['_links']['next']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}"
67
- expect(@collection_json['_links']['prev']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}"
65
+ expect(@collection_json['_links']['self']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}"
66
+ expect(@collection_json['_links']['next']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}"
67
+ expect(@collection_json['_links']['prev']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}"
68
68
  end
69
69
 
70
70
  it 'returns the _embedded node' do
71
- expect(@collection_json['_embedded']['articles']).to eq [{ 'id' => article.id, 'title' => article.title, 'key' => article.key, '_links' => { 'self' => { 'href' => "#{Article.api_root}/#{Article.collection_method_name}/#{article.id}" } } }]
71
+ expect(@collection_json['_embedded']['articles']).to eq [{ 'id' => article.id, 'title' => article.title, 'key' => article.key, '_links' => { 'self' => { 'href' => "#{Article.config[:api_root_url]}/#{Article.collection_method_name}/#{article.id}" } } }]
72
72
  end
73
73
 
74
74
  it 'returns the current_page' do
@@ -89,13 +89,14 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
89
89
  end
90
90
 
91
91
  it 'returns the _links node' do
92
- expect(@collection_json['_links']['self']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}"
93
- expect(@collection_json['_links']['next']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}"
94
- expect(@collection_json['_links']['prev']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}"
92
+ expect(@collection_json['_links']['self']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}"
93
+ expect(@collection_json['_links']['next']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}"
94
+ expect(@collection_json['_links']['prev']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}"
95
95
  end
96
96
 
97
97
  it 'returns the _embedded node' do
98
- expect(@collection_json['_embedded']['articles']).to eq [{ 'id' => article.id, 'title' => article.title, 'key' => article.key, '_links' => { 'self' => { 'href' => "#{Article.api_root}/#{Article.collection_method_name}/#{article.id}?key=#{article.key}" } } }]
98
+ expect(@collection_json['_embedded']['articles'])
99
+ .to eq [{ 'id' => article.id, 'title' => article.title, 'key' => article.key, '_links' => { 'self' => { 'href' => "#{Article.config[:api_root_url]}/#{Article.collection_method_name}/#{article.id}?key=#{article.key}" } } }]
99
100
  end
100
101
 
101
102
  it 'returns the current_page' do
@@ -119,7 +120,7 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
119
120
  end
120
121
 
121
122
  it 'returns the _links node' do
122
- expect(@resource_json['_links']['self']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}/#{article.id}"
123
+ expect(@resource_json['_links']['self']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}/#{article.id}"
123
124
  end
124
125
 
125
126
  it 'returns the resource attributes' do
@@ -133,7 +134,7 @@ RSpec.describe Braque::Helpers::HypermediaResponsesHelper do
133
134
  end
134
135
 
135
136
  it 'returns the _links node' do
136
- expect(@resource_json['_links']['self']['href']).to eq "#{Article.api_root}/#{Article.collection_method_name}/#{article.id}?key=#{article.key}"
137
+ expect(@resource_json['_links']['self']['href']).to eq "#{Article.config[:api_root_url]}/#{Article.collection_method_name}/#{article.id}?key=#{article.key}"
137
138
  end
138
139
 
139
140
  it 'returns the resource attributes' do
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Braque::Model attribute definitions', type: :model do
4
+ context 'with multiple defined Braque::Model classes' do
5
+ let(:identifier) { 1234 }
6
+ class Agate
7
+ include ::Braque::Model
8
+ end
9
+
10
+ class AbsoluteTime
11
+ include ::Braque::Model
12
+ attribute :id
13
+ end
14
+
15
+ class Aftershock
16
+ include ::Braque::Model
17
+ attribute :slug
18
+
19
+ def to_param
20
+ slug
21
+ end
22
+
23
+ def resource_find_options
24
+ { slug: slug }
25
+ end
26
+ end
27
+
28
+ class Amygdule < AbsoluteTime
29
+ attribute :slug
30
+
31
+ def to_param
32
+ slug
33
+ end
34
+
35
+ def resource_find_options
36
+ { slug: slug }
37
+ end
38
+ end
39
+
40
+ class Anticline < AbsoluteTime
41
+ attribute :identity
42
+
43
+ def to_param
44
+ identity
45
+ end
46
+
47
+ def resource_find_options
48
+ { identity: identity }
49
+ end
50
+ end
51
+
52
+ context '.to_param' do
53
+ it 'raises an error unless id is defined or the method overridden' do
54
+ expect { Agate.new.to_param }.to raise_error(
55
+ RuntimeError, 'Please overide to_param or add id to your model attributes.'
56
+ )
57
+ end
58
+
59
+ it 'sets to_param string based on instance.id' do
60
+ expect(AbsoluteTime.new(id: identifier).to_param).to eq identifier.to_s
61
+ end
62
+
63
+ it 'sets to_param based the overide' do
64
+ expect(Aftershock.new(slug: identifier).to_param).to eq identifier
65
+ end
66
+
67
+ it 'sets to_param based the overide' do
68
+ expect(Amygdule.new(slug: identifier).to_param).to eq identifier
69
+ end
70
+
71
+ it 'sets to_param based the overide' do
72
+ expect(Anticline.new(identity: identifier).to_param).to eq identifier
73
+ end
74
+ end
75
+
76
+ context '.resource_find_options' do
77
+ it 'raises an error unless id is defined or the method is overridden' do
78
+ expect { Agate.new.resource_find_options }.to raise_error(
79
+ RuntimeError, 'Please overide resource_find_options or add id to your model attributes.'
80
+ )
81
+ end
82
+
83
+ it 'returns a hash with the ID' do
84
+ expect(AbsoluteTime.new(id: identifier).resource_find_options).to eq(id: identifier)
85
+ end
86
+
87
+ it 'returns the overide' do
88
+ expect(Aftershock.new(slug: identifier).resource_find_options).to eq(slug: identifier)
89
+ end
90
+
91
+ it 'returns the overide' do
92
+ expect(Amygdule.new(slug: identifier).resource_find_options).to eq(slug: identifier)
93
+ end
94
+
95
+ it 'returns the overide' do
96
+ expect(Anticline.new(identity: identifier).resource_find_options).to eq(identity: identifier)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -4,9 +4,10 @@ RSpec.describe Braque::Model, type: :model do
4
4
  before(:all) do
5
5
  class Breeze
6
6
  include ::Braque::Model
7
- self.api_root = 'http://localhost:9292'
8
- self.http_authorization_header = 'replace-me'
9
- self.accept_header = 'application/vnd.el-nino-v1+json'
7
+ api_root_url 'http://localhost:9292'
8
+ http_authorization_header 'replace-me'
9
+ accept_header 'application/vnd.el-nino-v1+json'
10
+
10
11
  attribute :id
11
12
  attribute :title
12
13
  attribute :token
@@ -19,16 +20,16 @@ RSpec.describe Braque::Model, type: :model do
19
20
  let(:resource_response) { JSON.parse(File.read 'spec/fixtures/resource.json') }
20
21
 
21
22
  let(:root_request) do
22
- WebMock.stub_request(:get, "#{Breeze.api_root}/")
23
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
24
- .with(headers: { 'Accept' => Breeze.accept_header })
23
+ WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/")
24
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
25
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
25
26
  .to_return(status: 200, body: root_response)
26
27
  end
27
28
 
28
29
  let(:root_request_with_token_resource_path) do
29
- WebMock.stub_request(:get, "#{Breeze.api_root}/")
30
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
31
- .with(headers: { 'Accept' => Breeze.accept_header })
30
+ WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/")
31
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
32
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
32
33
  .to_return(status: 200, body: root_response_with_token_resource_path)
33
34
  end
34
35
 
@@ -49,9 +50,9 @@ RSpec.describe Braque::Model, type: :model do
49
50
  context 'with results' do
50
51
  before(:each) do
51
52
  root_request
52
- @collection_request = WebMock.stub_request(:get, "#{Breeze.api_root}/breezes")
53
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
54
- .with(headers: { 'Accept' => Breeze.accept_header })
53
+ @collection_request = WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/breezes")
54
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
55
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
55
56
  .to_return(status: 200, body: collection_response)
56
57
  @breezes = Breeze.list
57
58
  end
@@ -70,18 +71,21 @@ RSpec.describe Braque::Model, type: :model do
70
71
  expect(@breezes.first).to be_a_kind_of Breeze
71
72
  end
72
73
  it 'returns an array of items with the correct attributes' do
73
- @breezes.each_with_index do |breeze, index|
74
+ index = 0
75
+ while index < @breezes.size
76
+ breeze = @breezes[index]
74
77
  expect(breeze.id).to eq collection_response['_embedded']['breezes'][index]['id']
75
78
  expect(breeze.title).to eq collection_response['_embedded']['breezes'][index]['title']
79
+ index += 1
76
80
  end
77
81
  end
78
82
  end
79
83
  context 'with an errored response' do
80
84
  before(:each) do
81
85
  root_request
82
- @collection_request = WebMock.stub_request(:get, "#{Breeze.api_root}/breezes")
83
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
84
- .with(headers: { 'Accept' => Breeze.accept_header })
86
+ @collection_request = WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/breezes")
87
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
88
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
85
89
  .to_return(status: 500)
86
90
  end
87
91
  it 'returns a Faraday::ClientError error' do
@@ -95,9 +99,9 @@ RSpec.describe Braque::Model, type: :model do
95
99
  context 'with array params' do
96
100
  before(:each) do
97
101
  root_request
98
- @collection_request = WebMock.stub_request(:get, "#{Breeze.api_root}/breezes")
99
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
100
- .with(headers: { 'Accept' => Breeze.accept_header })
102
+ @collection_request = WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/breezes")
103
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
104
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
101
105
  .with(query: 'ids%5B0%5D=1&ids%5B1%5D=2')
102
106
  .to_return(status: 200, body: collection_response)
103
107
  @breezes = Breeze.list('ids[]' => [1, 2])
@@ -112,9 +116,9 @@ RSpec.describe Braque::Model, type: :model do
112
116
  context 'under normal conditions' do
113
117
  before(:each) do
114
118
  root_request
115
- @resource_request = WebMock.stub_request(:get, "#{Breeze.api_root}/breezes/1")
116
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
117
- .with(headers: { 'Accept' => Breeze.accept_header })
119
+ @resource_request = WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/breezes/1")
120
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
121
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
118
122
  .to_return(status: 200, body: resource_response)
119
123
  @breeze = Breeze.find(id: 1)
120
124
  end
@@ -135,9 +139,9 @@ RSpec.describe Braque::Model, type: :model do
135
139
  context 'with an errored response' do
136
140
  before(:each) do
137
141
  root_request
138
- @resource_request = WebMock.stub_request(:get, "#{Breeze.api_root}/breezes/1")
139
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
140
- .with(headers: { 'Accept' => Breeze.accept_header })
142
+ @resource_request = WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/breezes/1")
143
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
144
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
141
145
  .to_return(status: 500)
142
146
  end
143
147
  it 'returns a Faraday::ClientError error' do
@@ -157,9 +161,9 @@ RSpec.describe Braque::Model, type: :model do
157
161
  end
158
162
 
159
163
  root_request_with_token_resource_path
160
- @resource_request = WebMock.stub_request(:get, "#{Breeze.api_root}/breezes/1?token=123")
161
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
162
- .with(headers: { 'Accept' => Breeze.accept_header })
164
+ @resource_request = WebMock.stub_request(:get, "#{Breeze.config[:api_root_url]}/breezes/1?token=123")
165
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
166
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
163
167
  .to_return(status: 200, body: resource_response)
164
168
  @breeze = Breeze.find(id: 1, token: 123)
165
169
  end
@@ -184,9 +188,9 @@ RSpec.describe Braque::Model, type: :model do
184
188
  context 'with a successful response' do
185
189
  before(:each) do
186
190
  root_request
187
- @create_request = WebMock.stub_request(:post, "#{Breeze.api_root}/breezes")
188
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
189
- .with(headers: { 'Accept' => Breeze.accept_header })
191
+ @create_request = WebMock.stub_request(:post, "#{Breeze.config[:api_root_url]}/breezes")
192
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
193
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
190
194
  .to_return(status: 201, body: resource_response)
191
195
  @params = { title: 'What a nice breeze.' }
192
196
  @breeze = Breeze.create(@params)
@@ -209,9 +213,9 @@ RSpec.describe Braque::Model, type: :model do
209
213
  context 'with an errored response' do
210
214
  before(:each) do
211
215
  root_request
212
- @create_request = WebMock.stub_request(:post, "#{Breeze.api_root}/breezes")
213
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
214
- .with(headers: { 'Accept' => Breeze.accept_header })
216
+ @create_request = WebMock.stub_request(:post, "#{Breeze.config[:api_root_url]}/breezes")
217
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
218
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
215
219
  .to_return(status: 500)
216
220
  end
217
221
  it 'returns a Faraday::ClientError error' do
@@ -232,9 +236,9 @@ RSpec.describe Braque::Model, type: :model do
232
236
  context 'under normal conditions' do
233
237
  before(:each) do
234
238
  root_request
235
- @save_request = WebMock.stub_request(:patch, "#{Breeze.api_root}/breezes/1")
236
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
237
- .with(headers: { 'Accept' => Breeze.accept_header })
239
+ @save_request = WebMock.stub_request(:patch, "#{Breeze.config[:api_root_url]}/breezes/1")
240
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
241
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
238
242
  .to_return(status: 200, body: resource_response)
239
243
  @params = { title: 'What a nice breeze.' }
240
244
  @breeze = Breeze.new(id: 1).save(@params)
@@ -257,9 +261,9 @@ RSpec.describe Braque::Model, type: :model do
257
261
  context 'with an errored response' do
258
262
  before(:each) do
259
263
  root_request
260
- @save_request = WebMock.stub_request(:patch, "#{Breeze.api_root}/breezes/1")
261
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
262
- .with(headers: { 'Accept' => Breeze.accept_header })
264
+ @save_request = WebMock.stub_request(:patch, "#{Breeze.config[:api_root_url]}/breezes/1")
265
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
266
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
263
267
  .to_return(status: 500)
264
268
  end
265
269
  it 'returns a Faraday::ClientError error' do
@@ -280,9 +284,9 @@ RSpec.describe Braque::Model, type: :model do
280
284
  end
281
285
 
282
286
  root_request_with_token_resource_path
283
- @save_request = WebMock.stub_request(:patch, "#{Breeze.api_root}/breezes/1?token=123")
284
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
285
- .with(headers: { 'Accept' => Breeze.accept_header })
287
+ @save_request = WebMock.stub_request(:patch, "#{Breeze.config[:api_root_url]}/breezes/1?token=123")
288
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
289
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
286
290
  .to_return(status: 200, body: resource_response)
287
291
  @params = { title: 'What a nice breeze.' }
288
292
  @breeze = Breeze.new(id: 1, token: 123).save(@params)
@@ -311,9 +315,9 @@ RSpec.describe Braque::Model, type: :model do
311
315
  context 'under normal conditions' do
312
316
  before(:each) do
313
317
  root_request
314
- @destroy_request = WebMock.stub_request(:delete, "#{Breeze.api_root}/breezes/1")
315
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
316
- .with(headers: { 'Accept' => Breeze.accept_header })
318
+ @destroy_request = WebMock.stub_request(:delete, "#{Breeze.config[:api_root_url]}/breezes/1")
319
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
320
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
317
321
  .to_return(status: 200)
318
322
  @breeze = Breeze.new(id: 1).destroy
319
323
  end
@@ -328,9 +332,9 @@ RSpec.describe Braque::Model, type: :model do
328
332
  context 'with an errored response' do
329
333
  before(:each) do
330
334
  root_request
331
- @destroy_request = WebMock.stub_request(:delete, "#{Breeze.api_root}/breezes/1")
332
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
333
- .with(headers: { 'Accept' => Breeze.accept_header })
335
+ @destroy_request = WebMock.stub_request(:delete, "#{Breeze.config[:api_root_url]}/breezes/1")
336
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
337
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
334
338
  .to_return(status: 500)
335
339
  end
336
340
  it 'returns a Faraday::ClientError error' do
@@ -351,9 +355,9 @@ RSpec.describe Braque::Model, type: :model do
351
355
  end
352
356
 
353
357
  root_request_with_token_resource_path
354
- @destroy_request = WebMock.stub_request(:delete, "#{Breeze.api_root}/breezes/1?token=123")
355
- .with(headers: { 'Http-Authorization' => Breeze.http_authorization_header })
356
- .with(headers: { 'Accept' => Breeze.accept_header })
358
+ @destroy_request = WebMock.stub_request(:delete, "#{Breeze.config[:api_root_url]}/breezes/1?token=123")
359
+ .with(headers: { 'Http-Authorization' => Breeze.config[:http_authorization_header] })
360
+ .with(headers: { 'Accept' => Breeze.config[:accept_header] })
357
361
  .to_return(status: 200)
358
362
  @breeze = Breeze.new(id: 1, token: 123).destroy
359
363
  end
@@ -5,22 +5,22 @@ RSpec.describe Braque::Model, type: :model do
5
5
  before do
6
6
  class Wind
7
7
  include ::Braque::Model
8
- self.api_root = 'http://localhost:9292'
9
- self.http_authorization_header = 'replace-me'
8
+ api_root_url 'http://localhost:9292'
9
+ http_authorization_header 'replace-me'
10
10
  end
11
11
 
12
12
  class Tide
13
13
  include ::Braque::Model
14
- self.api_root = 'http://localhost:9393'
15
- self.http_authorization_header = 'do-replace-me-as-well'
14
+ api_root_url 'http://localhost:9393'
15
+ http_authorization_header 'do-replace-me-as-well'
16
16
  end
17
17
  end
18
18
 
19
19
  it 'sets the correct api_root and http_authorization_header for each class' do
20
- expect(Tide.api_root).to eq 'http://localhost:9393'
21
- expect(Tide.http_authorization_header).to eq 'do-replace-me-as-well'
22
- expect(Wind.api_root).to eq 'http://localhost:9292'
23
- expect(Wind.http_authorization_header).to eq 'replace-me'
20
+ expect(Tide.config[:api_root_url]).to eq 'http://localhost:9393'
21
+ expect(Tide.config[:http_authorization_header]).to eq 'do-replace-me-as-well'
22
+ expect(Wind.config[:api_root_url]).to eq 'http://localhost:9292'
23
+ expect(Wind.config[:http_authorization_header]).to eq 'replace-me'
24
24
  end
25
25
  end
26
26
  end
@@ -5,41 +5,41 @@ RSpec.describe Braque::Model, type: :model do
5
5
  before do
6
6
  class GeologicModel
7
7
  include ::Braque::Model
8
- self.api_root = 'http://localhost:9292'
9
- self.http_authorization_header = 'replace-me'
8
+ api_root_url 'http://localhost:9292'
9
+ http_authorization_header 'replace-me'
10
10
  end
11
11
 
12
12
  class ContinentalDrift < GeologicModel
13
13
  end
14
14
 
15
15
  class Convection < GeologicModel
16
- self.api_root = 'http://localhost:9595'
17
- self.http_authorization_header = 'ok-another-one-to-replace'
16
+ api_root_url 'http://localhost:9595'
17
+ http_authorization_header 'ok-another-one-to-replace'
18
18
  end
19
19
 
20
20
  class SeafloorSpreading
21
21
  include ::Braque::Model
22
- self.api_root = 'http://localhost:9393'
23
- self.http_authorization_header = 'do-replace-me-as-well'
22
+ api_root_url 'http://localhost:9393'
23
+ http_authorization_header 'do-replace-me-as-well'
24
24
  end
25
25
  end
26
26
 
27
27
  context 'api configuration' do
28
28
  it 'sets the correct api_root and api_token for the base class' do
29
- expect(GeologicModel.api_root).to eq 'http://localhost:9292'
30
- expect(GeologicModel.http_authorization_header).to eq 'replace-me'
29
+ expect(GeologicModel.config[:api_root_url]).to eq 'http://localhost:9292'
30
+ expect(GeologicModel.config[:http_authorization_header]).to eq 'replace-me'
31
31
  end
32
32
  it 'sets the correct api_root and api_token for a subclassed class' do
33
- expect(ContinentalDrift.api_root).to eq 'http://localhost:9292'
34
- expect(ContinentalDrift.http_authorization_header).to eq 'replace-me'
33
+ expect(ContinentalDrift.config[:api_root_url]).to eq 'http://localhost:9292'
34
+ expect(ContinentalDrift.config[:http_authorization_header]).to eq 'replace-me'
35
35
  end
36
36
  it 'sets the correct api_root and api_token for a subclassed class with variable overrides' do
37
- expect(Convection.api_root).to eq 'http://localhost:9595'
38
- expect(Convection.http_authorization_header).to eq 'ok-another-one-to-replace'
37
+ expect(Convection.config[:api_root_url]).to eq 'http://localhost:9595'
38
+ expect(Convection.config[:http_authorization_header]).to eq 'ok-another-one-to-replace'
39
39
  end
40
40
  it 'sets the correct api_root and api_token for a new Braque::Model class' do
41
- expect(SeafloorSpreading.api_root).to eq 'http://localhost:9393'
42
- expect(SeafloorSpreading.http_authorization_header).to eq 'do-replace-me-as-well'
41
+ expect(SeafloorSpreading.config[:api_root_url]).to eq 'http://localhost:9393'
42
+ expect(SeafloorSpreading.config[:http_authorization_header]).to eq 'do-replace-me-as-well'
43
43
  end
44
44
  end
45
45
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braque
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dylan Fareed
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-04 00:00:00.000000000 Z
11
+ date: 2015-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hyperclient
@@ -68,9 +68,11 @@ files:
68
68
  - lib/braque/helpers/hypermedia_responses_helper.rb
69
69
  - lib/braque/model.rb
70
70
  - lib/braque/version.rb
71
+ - spec/braque/api_root_spec.rb
71
72
  - spec/braque/client_headers_spec.rb
72
73
  - spec/braque/collection_spec.rb
73
74
  - spec/braque/helpers/hypermedia_responses_helper_spec.rb
75
+ - spec/braque/model_attributes_spec.rb
74
76
  - spec/braque/model_spec.rb
75
77
  - spec/braque/multiple_model_spec.rb
76
78
  - spec/braque/subclassed_model_spec.rb