bootic_client 0.0.19 → 0.0.20

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: dcfbbb311b78031493af896f6db383dfebdffd82
4
- data.tar.gz: ddbeb3d2dd2ff06defbaa67acdfbd32006fa074e
3
+ metadata.gz: bd55ff4344906b2db45c139a932b1fe546bd83ac
4
+ data.tar.gz: 773cbf15b9e596ef502aae54e65df649c9da3bc1
5
5
  SHA512:
6
- metadata.gz: b510fb186560ceeda306b87a72e22cdfbed0df944fc04c9950bf07ac9c6ec9bbb169914487d3ada5405fa57817c76b1c656e0fd209da015354057187042a7c97
7
- data.tar.gz: a026d7e471ec31d53fd302f43afc8b6a80a24eaa2f827958c02ad6d6c543b4d9f4860c8158fad123a624dbb6ed67fcf482a91a6058fa7a041a44610e2311f414
6
+ metadata.gz: febd1da193a466980cfaaa62b8bcf29eb78a44b7629f65754b12dfd9d06c98266a005dd0fad6c2aa7a50d5b465feef096526a9edac07255dfaca9d37f9c583cc
7
+ data.tar.gz: 94449a8bfc7d58a03c9ae30cf80db26fe6e2946c0d7a183c05b69ee87fc4248834cf6642b2f116798026f09d9b20da4575c4cd9ce6c4ca866e17f2536b0c2f07
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.0.19](https://github.com/bootic/bootic_client.rb/tree/v0.0.19) (2017-06-01)
4
+ [Full Changelog](https://github.com/bootic/bootic_client.rb/compare/v0.0.18...v0.0.19)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Raise errors on invalid URLs [\#11](https://github.com/bootic/bootic_client.rb/pull/11) ([ismasan](https://github.com/ismasan))
9
+
3
10
  ## [v0.0.18](https://github.com/bootic/bootic_client.rb/tree/v0.0.18) (2017-04-03)
4
11
  [Full Changelog](https://github.com/bootic/bootic_client.rb/compare/v0.0.17...v0.0.18)
5
12
 
@@ -33,7 +40,7 @@
33
40
 
34
41
  **Merged pull requests:**
35
42
 
36
- - Base64-encode IO instances before POST|PUT|PATH [\#6](https://github.com/bootic/bootic_client.rb/pull/6) ([ismasan](https://github.com/ismasan))
43
+ - Base64-encode IO instances before POST|PUT|PATCH [\#6](https://github.com/bootic/bootic_client.rb/pull/6) ([ismasan](https://github.com/ismasan))
37
44
 
38
45
  ## [v0.0.13](https://github.com/bootic/bootic_client.rb/tree/v0.0.13) (2016-01-12)
39
46
  [Full Changelog](https://github.com/bootic/bootic_client.rb/compare/v0.0.12...v0.0.13)
data/lib/bootic_client.rb CHANGED
@@ -5,14 +5,15 @@ require "bootic_client/relation"
5
5
  require "bootic_client/client"
6
6
 
7
7
  module BooticClient
8
+ InvalidConfigurationError = Class.new(StandardError)
9
+ VERY_BASIC_URL_CHECK = /^(http|https):/.freeze
8
10
 
9
11
  AUTH_HOST = 'https://auth.bootic.net'.freeze
10
12
  API_ROOT = 'https://api.bootic.net/v1'.freeze
11
13
 
12
14
  class << self
13
-
14
- attr_accessor :client_secret, :client_id, :logging, :cache_store
15
- attr_writer :auth_host, :api_root, :logger
15
+ attr_accessor :logging
16
+ attr_reader :client_id, :client_secret, :cache_store
16
17
 
17
18
  def strategies
18
19
  @strategies ||= {}
@@ -27,6 +28,32 @@ module BooticClient
27
28
  strategies.fetch(strategy_name.to_sym).new self, opts, &on_new_token
28
29
  end
29
30
 
31
+ def client_id=(v)
32
+ set_non_nil :client_id, v
33
+ end
34
+
35
+ def client_secret=(v)
36
+ set_non_nil :client_secret, v
37
+ end
38
+
39
+ def cache_store=(v)
40
+ set_non_nil :cache_store, v
41
+ end
42
+
43
+ def auth_host=(v)
44
+ check_url! :auth_host, v
45
+ set_non_nil :auth_host, v
46
+ end
47
+
48
+ def api_root=(v)
49
+ check_url! :api_root, v
50
+ set_non_nil :api_root, v
51
+ end
52
+
53
+ def logger=(v)
54
+ set_non_nil :logger, v
55
+ end
56
+
30
57
  def auth_host
31
58
  @auth_host || AUTH_HOST
32
59
  end
@@ -42,6 +69,14 @@ module BooticClient
42
69
  def configure(&block)
43
70
  yield self
44
71
  end
45
- end
46
72
 
73
+ def set_non_nil(name, v)
74
+ raise InvalidConfigurationError, "#{name} cannot be nil" if v.nil?
75
+ instance_variable_set("@#{name}", v)
76
+ end
77
+
78
+ def check_url!(name, v)
79
+ raise InvalidConfigurationError, "#{name} must be a valid URL" unless v.to_s =~ VERY_BASIC_URL_CHECK
80
+ end
81
+ end
47
82
  end
@@ -30,7 +30,7 @@ module BooticClient
30
30
 
31
31
  attr_reader :curies, :entities
32
32
 
33
- def initialize(attrs, client, top = self)
33
+ def initialize(attrs, client, top: self)
34
34
  @attrs = attrs.kind_of?(Hash) ? attrs : {}
35
35
  @client, @top = client, top
36
36
  build!
@@ -123,7 +123,7 @@ module BooticClient
123
123
  end
124
124
  if rel != CURIES_REL
125
125
  rel_attrs['name'] = rel
126
- memo[rel.to_sym] = Relation.new(rel_attrs, client, Entity)
126
+ memo[rel.to_sym] = Relation.new(rel_attrs, client)
127
127
  end
128
128
  end
129
129
  )
@@ -142,9 +142,9 @@ module BooticClient
142
142
 
143
143
  @entities = attrs.fetch('_embedded', {}).each_with_object({}) do |(k,v),memo|
144
144
  memo[k.to_sym] = if v.kind_of?(Array)
145
- v.map{|ent_attrs| Entity.new(ent_attrs, client, top)}
145
+ v.map{|ent_attrs| Entity.new(ent_attrs, client, top: top)}
146
146
  else
147
- Entity.new(v, client, top)
147
+ Entity.new(v, client, top: top)
148
148
  end
149
149
  end
150
150
  end
@@ -1,16 +1,26 @@
1
1
  require "bootic_client/whiny_uri"
2
2
  require "bootic_client/entity"
3
+ require 'ostruct'
3
4
 
4
5
  module BooticClient
5
6
 
6
7
  class Relation
7
-
8
8
  GET = 'get'.freeze
9
9
  HEAD = 'head'.freeze
10
10
  OPTIONS = 'options'.freeze
11
11
 
12
- def initialize(attrs, client, wrapper_class = Entity)
13
- @attrs, @client, @wrapper_class = attrs, client, wrapper_class
12
+ class << self
13
+ attr_writer :complain_on_undeclared_params
14
+
15
+ def complain_on_undeclared_params
16
+ return true unless instance_variable_defined?('@complain_on_undeclared_params')
17
+ @complain_on_undeclared_params
18
+ end
19
+ end
20
+
21
+ def initialize(attrs, client, entity_class: Entity, complain_on_undeclared_params: self.class.complain_on_undeclared_params)
22
+ @attrs, @client, @entity_class = attrs, client, entity_class
23
+ @complain_on_undeclared_params = complain_on_undeclared_params
14
24
  end
15
25
 
16
26
  def inspect
@@ -61,9 +71,9 @@ module BooticClient
61
71
  end
62
72
  # remove payload vars from URI opts if destructive action
63
73
  opts = opts.reject{|k, v| !uri_vars.include?(k.to_s) } if destructive?
64
- client.request_and_wrap transport_method.to_sym, uri.expand(opts), wrapper_class, payload
74
+ client.request_and_wrap transport_method.to_sym, uri.expand(opts), entity_class, payload
65
75
  else
66
- client.request_and_wrap transport_method.to_sym, href, wrapper_class, opts
76
+ client.request_and_wrap transport_method.to_sym, href, entity_class, opts
67
77
  end
68
78
  end
69
79
 
@@ -72,10 +82,10 @@ module BooticClient
72
82
  end
73
83
 
74
84
  protected
75
- attr_reader :wrapper_class, :client, :attrs
85
+ attr_reader :entity_class, :client, :attrs, :complain_on_undeclared_params
76
86
 
77
87
  def uri
78
- @uri ||= WhinyURI.new(href)
88
+ @uri ||= WhinyURI.new(href, complain_on_undeclared_params)
79
89
  end
80
90
 
81
91
  def destructive?
@@ -1,3 +1,3 @@
1
1
  module BooticClient
2
- VERSION = "0.0.19"
2
+ VERSION = "0.0.20".freeze
3
3
  end
@@ -4,28 +4,33 @@ module BooticClient
4
4
  class WhinyURI
5
5
  attr_reader :variables
6
6
 
7
- def initialize(href)
7
+ def initialize(href, complain_on_undeclared_params = true)
8
8
  @href = href
9
9
  @uri = URITemplate.new(href)
10
10
  @variables = @uri.variables
11
+ @complain_on_undeclared_params = complain_on_undeclared_params
11
12
  end
12
13
 
13
14
  def expand(attrs = {})
15
+ attrs = stringify(attrs)
16
+
14
17
  missing = missing_path_variables(attrs)
15
18
  if missing.any?
16
19
  raise InvalidURLError, missing_err(missing)
17
20
  end
18
21
 
19
22
  undeclared = undeclared_params(attrs)
20
- if undeclared.any?
21
- raise InvalidURLError, undeclared_err(undeclared)
23
+ if complain_on_undeclared_params
24
+ if undeclared.any?
25
+ raise InvalidURLError, undeclared_err(undeclared)
26
+ end
22
27
  end
23
28
 
24
- uri.expand attrs
29
+ uri.expand whitelisted(attrs)
25
30
  end
26
31
 
27
32
  private
28
- attr_reader :uri, :href
33
+ attr_reader :uri, :href, :complain_on_undeclared_params
29
34
 
30
35
  def path_variables
31
36
  @path_variables ||= (
@@ -35,12 +40,22 @@ module BooticClient
35
40
  )
36
41
  end
37
42
 
43
+ def whitelisted(attrs = {})
44
+ variables.each_with_object({}) do |key, hash|
45
+ hash[key] = attrs[key] if attrs.key?(key)
46
+ end
47
+ end
48
+
38
49
  def missing_path_variables(attrs)
39
- path_variables - attrs.keys.map(&:to_s)
50
+ path_variables - attrs.keys
51
+ end
52
+
53
+ def declared_params
54
+ @declared_params ||= variables - path_variables
40
55
  end
41
56
 
42
57
  def undeclared_params(attrs)
43
- attrs.keys.map(&:to_s) - variables
58
+ attrs.keys - variables
44
59
  end
45
60
 
46
61
  def undeclared_err(undeclared)
@@ -57,6 +72,12 @@ module BooticClient
57
72
  def format_vars(vars)
58
73
  vars.map{|v| "`#{v}`"}.join(', ')
59
74
  end
75
+
76
+ def stringify(attrs)
77
+ attrs.each_with_object({}) do |(k, v), hash|
78
+ hash[k.to_s] = v
79
+ end
80
+ end
60
81
  end
61
82
  end
62
83
 
@@ -15,7 +15,7 @@ describe 'BooticClient::Strategies::ClientCredentials' do
15
15
 
16
16
  describe 'with missing client credentials' do
17
17
  it 'raises error' do
18
- BooticClient.client_id = nil
18
+ allow(BooticClient).to receive(:client_id).and_return nil
19
19
  expect{
20
20
  BooticClient.client(:client_credentials, scope: 'admin')
21
21
  }.to raise_error(ArgumentError)
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe BooticClient do
4
+ it "raises if nil client_id" do
5
+ expect {
6
+ BooticClient.configure do |c|
7
+ c.client_id = nil
8
+ end
9
+ }.to raise_error BooticClient::InvalidConfigurationError
10
+ end
11
+
12
+ it "raises if nil client_secret" do
13
+ expect {
14
+ BooticClient.configure do |c|
15
+ c.client_secret = nil
16
+ end
17
+ }.to raise_error BooticClient::InvalidConfigurationError
18
+ end
19
+
20
+ it "raises if nil cache_store" do
21
+ expect {
22
+ BooticClient.configure do |c|
23
+ c.cache_store = nil
24
+ end
25
+ }.to raise_error BooticClient::InvalidConfigurationError
26
+ end
27
+
28
+ it "raises if nil or invalid auth_host" do
29
+ expect {
30
+ BooticClient.configure do |c|
31
+ c.auth_host = nil
32
+ end
33
+ }.to raise_error BooticClient::InvalidConfigurationError
34
+
35
+ expect {
36
+ BooticClient.configure do |c|
37
+ c.auth_host = 'not-a-url'
38
+ end
39
+ }.to raise_error BooticClient::InvalidConfigurationError
40
+ end
41
+
42
+ it "raises if nil or invalid api_root" do
43
+ expect {
44
+ BooticClient.configure do |c|
45
+ c.api_root = nil
46
+ end
47
+ }.to raise_error BooticClient::InvalidConfigurationError
48
+
49
+ expect {
50
+ BooticClient.configure do |c|
51
+ c.api_root = 'not-a-url'
52
+ end
53
+ }.to raise_error BooticClient::InvalidConfigurationError
54
+ end
55
+
56
+ it "raises if nil logger" do
57
+ expect {
58
+ BooticClient.configure do |c|
59
+ c.logger = nil
60
+ end
61
+ }.to raise_error BooticClient::InvalidConfigurationError
62
+ end
63
+ end
data/spec/entity_spec.rb CHANGED
@@ -174,6 +174,12 @@ describe BooticClient::Entity do
174
174
  expect(next_entity.page).to eql(2)
175
175
  end
176
176
  end
177
+
178
+ it 'complains if passing undeclared link params' do
179
+ expect {
180
+ entity.search(foo: 'bar')
181
+ }.to raise_error(BooticClient::InvalidURLError)
182
+ end
177
183
  end
178
184
 
179
185
  end
@@ -80,6 +80,25 @@ describe BooticClient::Relation do
80
80
  }.to raise_error BooticClient::InvalidURLError
81
81
  end
82
82
  end
83
+
84
+ context "configured to not complain on undeclared variables" do
85
+ it "whitelists params but does not complain" do
86
+ BooticClient::Relation.complain_on_undeclared_params = false
87
+
88
+ relation = BooticClient::Relation.new({
89
+ 'href' => '/foos/{id}{?q,page}',
90
+ 'templated' => true
91
+ },
92
+ client,
93
+ )
94
+
95
+ expect(client).to receive(:request_and_wrap).with(:get, '/foos/2?q=test&page=3', BooticClient::Entity, {foo: 1}).and_return entity
96
+
97
+ relation.run(id: 2, q: 'test', page: 3, foo: 1)
98
+
99
+ BooticClient::Relation.complain_on_undeclared_params = true
100
+ end
101
+ end
83
102
  end
84
103
 
85
104
  describe 'POST' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootic_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Celis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-01 00:00:00.000000000 Z
11
+ date: 2018-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -201,6 +201,7 @@ files:
201
201
  - spec/bootic_client_spec.rb
202
202
  - spec/client_credentials_strategy_spec.rb
203
203
  - spec/client_spec.rb
204
+ - spec/configuration_spec.rb
204
205
  - spec/entity_spec.rb
205
206
  - spec/fixtures/file.gif
206
207
  - spec/memcache_storage_spec.rb
@@ -227,7 +228,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
228
  version: '0'
228
229
  requirements: []
229
230
  rubyforge_project:
230
- rubygems_version: 2.5.1
231
+ rubygems_version: 2.6.13
231
232
  signing_key:
232
233
  specification_version: 4
233
234
  summary: Official Ruby client for the Bootic API
@@ -238,6 +239,7 @@ test_files:
238
239
  - spec/bootic_client_spec.rb
239
240
  - spec/client_credentials_strategy_spec.rb
240
241
  - spec/client_spec.rb
242
+ - spec/configuration_spec.rb
241
243
  - spec/entity_spec.rb
242
244
  - spec/fixtures/file.gif
243
245
  - spec/memcache_storage_spec.rb