bootic_client 0.0.19 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
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