springboard-retail 4.1.1 → 4.2.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 +5 -5
- data/Gemfile.lock +4 -4
- data/README.md +13 -0
- data/lib/springboard/client.rb +2 -7
- data/lib/springboard/client/collection.rb +13 -0
- data/lib/springboard/client/uri.rb +96 -0
- data/spec/spec_helper.rb +6 -1
- data/spec/springboard/client/resource_spec.rb +10 -0
- data/spec/springboard/client/{uri_ext_spec.rb → uri_spec.rb} +34 -5
- data/springboard-retail.gemspec +1 -1
- metadata +5 -5
- data/lib/springboard/client/uri_ext.rb +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 13eaf04ac55ef152f9c444f235656ad9899634d173aff26f6d87d287d9c07b94
|
4
|
+
data.tar.gz: ec8edecf083f85ce0750ba307080a00044daff4020acd8defd2ef6ce50ea45f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 158b90cf3fe6e854ec8aaa1ca77d503e7b43e3ce7aa106ad832bb5e85e3b6cde8712f6981d6f49827605d1fa636ed7dfb271edd32de805dac2deeac10412bf6d
|
7
|
+
data.tar.gz: 00e9ce7b716561a0994c06e2f8c78159f68346999f063cad57f9fb11ab2e1e5a1b66cef00849a5ee34950156ee81d1c6b37c287988783ba7a73cc2fcb7991d3a
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
springboard-retail (4.
|
4
|
+
springboard-retail (4.2.0)
|
5
5
|
addressable (~> 2.2.8)
|
6
6
|
hashie
|
7
7
|
json (>= 1.7.4)
|
@@ -24,8 +24,8 @@ GEM
|
|
24
24
|
safe_yaml (~> 1.0.0)
|
25
25
|
diff-lcs (1.2.5)
|
26
26
|
docile (1.1.5)
|
27
|
-
hashie (3.5.
|
28
|
-
json (2.0
|
27
|
+
hashie (3.5.7)
|
28
|
+
json (2.1.0)
|
29
29
|
method_source (0.8.2)
|
30
30
|
mime-types (2.4.3)
|
31
31
|
multi_json (1.11.0)
|
@@ -80,4 +80,4 @@ DEPENDENCIES
|
|
80
80
|
webmock
|
81
81
|
|
82
82
|
BUNDLED WITH
|
83
|
-
1.
|
83
|
+
1.16.2
|
data/README.md
CHANGED
@@ -103,6 +103,19 @@ resource.sort(:description, :created_at).filter(:active => true).each do |item|
|
|
103
103
|
end
|
104
104
|
```
|
105
105
|
|
106
|
+
### Returning select fields
|
107
|
+
Resources have a `only` method that accepts any number of field keys to return only the selected fields. Note that each call to `only` overwrites any previous fields.
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
resource.only(:id)
|
111
|
+
resource.only(:public_id, :updated_at)
|
112
|
+
|
113
|
+
# returns a new resource for chaining:
|
114
|
+
resource.only(:public_id, :updated_at).filter(:active => true).each do |item|
|
115
|
+
# ...
|
116
|
+
end
|
117
|
+
```
|
118
|
+
|
106
119
|
### Creating Resources
|
107
120
|
|
108
121
|
Create a new resource via POST:
|
data/lib/springboard/client.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'patron'
|
3
|
-
require 'addressable/uri'
|
4
3
|
require 'json'
|
5
4
|
|
6
5
|
require 'springboard/client/errors'
|
@@ -18,10 +17,6 @@ module Springboard
|
|
18
17
|
# Provides direct access to the URI-oriented interface via the HTTP methods.
|
19
18
|
# Provides access to the URI-oriented interface via the {#[]} method.
|
20
19
|
class Client
|
21
|
-
##
|
22
|
-
# Alias for {Addressable::URI}
|
23
|
-
URI = Addressable::URI
|
24
|
-
|
25
20
|
##
|
26
21
|
# Default number of records per page when iterating over collection resources
|
27
22
|
DEFAULT_PER_PAGE = 20
|
@@ -85,7 +80,7 @@ module Springboard
|
|
85
80
|
unless opts[:username] && opts[:password]
|
86
81
|
raise "Must specify :username and :password"
|
87
82
|
end
|
88
|
-
body = URI.form_encode \
|
83
|
+
body = ::Addressable::URI.form_encode \
|
89
84
|
:auth_key => opts[:username],
|
90
85
|
:password => opts[:password]
|
91
86
|
response = post '/auth/identity/callback', body,
|
@@ -265,4 +260,4 @@ end
|
|
265
260
|
require 'springboard/client/resource'
|
266
261
|
require 'springboard/client/response'
|
267
262
|
require 'springboard/client/body'
|
268
|
-
require 'springboard/client/
|
263
|
+
require 'springboard/client/uri'
|
@@ -79,6 +79,19 @@ module Springboard
|
|
79
79
|
query('sort' => sorts)
|
80
80
|
end
|
81
81
|
|
82
|
+
##
|
83
|
+
# Returns a new resource with the given fields added to the query string as _only parameters.
|
84
|
+
#
|
85
|
+
# @example
|
86
|
+
# resource.only('id', :public_id)
|
87
|
+
#
|
88
|
+
# @param [#to_s] returns One or more fields
|
89
|
+
#
|
90
|
+
# @return [Resource]
|
91
|
+
def only(*fields)
|
92
|
+
query('_only' => fields)
|
93
|
+
end
|
94
|
+
|
82
95
|
##
|
83
96
|
# Performs a request to get the first result of the first page of the
|
84
97
|
# collection and returns it.
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
|
3
|
+
module Springboard
|
4
|
+
class Client
|
5
|
+
##
|
6
|
+
# A wrapper around Addressable::URI
|
7
|
+
class URI
|
8
|
+
##
|
9
|
+
# Returns a URI object based on the parsed string.
|
10
|
+
#
|
11
|
+
# @return [URI]
|
12
|
+
def self.parse(value)
|
13
|
+
return value if value.is_a?(self)
|
14
|
+
new(::Addressable::URI.parse(value))
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Joins several URIs together.
|
19
|
+
#
|
20
|
+
# @return [URI]
|
21
|
+
def self.join(*args)
|
22
|
+
new(::Addressable::URI.join(*args))
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Creates a new URI object from an Addressable::URI
|
27
|
+
#
|
28
|
+
# @return [URI]
|
29
|
+
def initialize(uri)
|
30
|
+
@uri = uri
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Returns a new URI with the given subpath appended to it. Ensures a single
|
35
|
+
# forward slash between the URI's path and the given subpath.
|
36
|
+
#
|
37
|
+
# @return [URI]
|
38
|
+
def subpath(subpath)
|
39
|
+
uri = dup
|
40
|
+
uri.path = "#{path}/" unless path.end_with?('/')
|
41
|
+
uri.join subpath.to_s.gsub(/^\//, '')
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Merges the given hash of query string parameters and values with the URI's
|
46
|
+
# existing query string parameters (if any).
|
47
|
+
def merge_query_values!(values)
|
48
|
+
self.springboard_query_values = (self.query_values || {}).merge(normalize_query_hash(values))
|
49
|
+
end
|
50
|
+
|
51
|
+
def ==(other_uri)
|
52
|
+
return false unless other_uri.is_a?(self.class)
|
53
|
+
uri == other_uri.__send__(:uri)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
attr_reader :uri
|
59
|
+
|
60
|
+
def springboard_query_values=(values)
|
61
|
+
retval = self.query_values = normalize_query_hash(values)
|
62
|
+
# Hack to strip digits from Addressable::URI's subscript notation
|
63
|
+
self.query = self.query.gsub(/\[\d+\]=/, '[]=')
|
64
|
+
retval
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.delegate_and_wrap(*methods)
|
68
|
+
methods.each do |method|
|
69
|
+
define_method(method) do |*args, &block|
|
70
|
+
result = @uri.__send__(method, *args, &block)
|
71
|
+
if result.is_a?(Addressable::URI)
|
72
|
+
self.class.new(result)
|
73
|
+
else
|
74
|
+
result
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
delegate_and_wrap(
|
81
|
+
:join, :path, :path=, :form_encode, :to_s,
|
82
|
+
:query_values, :query_values=, :query, :query=
|
83
|
+
)
|
84
|
+
|
85
|
+
def normalize_query_hash(hash)
|
86
|
+
hash.inject({}) do |copy, (k, v)|
|
87
|
+
copy[k.to_s] = case v
|
88
|
+
when Hash then normalize_query_hash(v)
|
89
|
+
when true, false then v.to_s
|
90
|
+
else v end
|
91
|
+
copy
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,8 +5,13 @@ require 'springboard-retail'
|
|
5
5
|
require 'webmock/rspec'
|
6
6
|
require 'shared_client_context'
|
7
7
|
|
8
|
+
RSpec.configure do |c|
|
9
|
+
c.filter_run :focus => true
|
10
|
+
c.run_all_when_everything_filtered = true
|
11
|
+
end
|
12
|
+
|
8
13
|
class String
|
9
14
|
def to_uri
|
10
|
-
|
15
|
+
Springboard::Client::URI.parse(self)
|
11
16
|
end
|
12
17
|
end
|
@@ -97,6 +97,16 @@ describe Springboard::Client::Resource do
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
+
describe "only" do
|
101
|
+
it "should set the _only parameter based on the given values" do
|
102
|
+
expect(resource.only('f1', 'f2').uri.query).to eq('_only[]=f1&_only[]=f2')
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should replace the existing _only parameters" do
|
106
|
+
expect(resource.only('f1').only('f2', 'f3').uri.query).to eq('_only[]=f2&_only[]=f3')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
100
110
|
%w{count each each_page}.each do |method|
|
101
111
|
describe method do
|
102
112
|
it "should call the client's #{method} method with the resource's URI" do
|
@@ -1,13 +1,42 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
let(:uri) {
|
3
|
+
describe Springboard::Client::URI do
|
4
|
+
let(:uri) { described_class.parse('/relative/path') }
|
5
5
|
|
6
6
|
describe "subpath" do
|
7
7
|
it "should return a new URI with the path relative to the receiver" do
|
8
|
-
expect(uri.subpath('other')).to eq(
|
9
|
-
expect(uri.subpath('/other')).to eq(
|
10
|
-
uri.subpath(
|
8
|
+
expect(uri.subpath('other')).to eq(described_class.parse('/relative/path/other'))
|
9
|
+
expect(uri.subpath('/other')).to eq(described_class.parse('/relative/path/other'))
|
10
|
+
uri.subpath(described_class.parse('/other')) == described_class.parse('/relative/path/other')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "parse" do
|
15
|
+
it "should return a URI based on the given string" do
|
16
|
+
uri = described_class.parse('/some_path')
|
17
|
+
expect(uri).to be_a(described_class)
|
18
|
+
expect(uri.to_s).to eq('/some_path')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "==" do
|
23
|
+
it "should consider two URIs parsed from the same string equal" do
|
24
|
+
expect(
|
25
|
+
described_class.parse('http://example.com/some_path?a=1&b=2') ==
|
26
|
+
described_class.parse('http://example.com/some_path?a=1&b=2')
|
27
|
+
).to be(true)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should consider two URIs parsed from different strings not equal" do
|
31
|
+
expect(
|
32
|
+
described_class.parse('http://example.com/some_path?a=1&b=2') ==
|
33
|
+
described_class.parse('http://example.com/some_path?a=1&c=3')
|
34
|
+
).to be(false)
|
35
|
+
|
36
|
+
expect(
|
37
|
+
described_class.parse('http://foo.example.com') ==
|
38
|
+
described_class.parse('http://bar.example.com')
|
39
|
+
).to be(false)
|
11
40
|
end
|
12
41
|
end
|
13
42
|
|
data/springboard-retail.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: springboard-retail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay Stotz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: patron
|
@@ -88,13 +88,13 @@ files:
|
|
88
88
|
- lib/springboard/client/errors.rb
|
89
89
|
- lib/springboard/client/resource.rb
|
90
90
|
- lib/springboard/client/response.rb
|
91
|
-
- lib/springboard/client/
|
91
|
+
- lib/springboard/client/uri.rb
|
92
92
|
- spec/shared_client_context.rb
|
93
93
|
- spec/spec_helper.rb
|
94
94
|
- spec/springboard/client/body_spec.rb
|
95
95
|
- spec/springboard/client/resource_spec.rb
|
96
96
|
- spec/springboard/client/response_spec.rb
|
97
|
-
- spec/springboard/client/
|
97
|
+
- spec/springboard/client/uri_spec.rb
|
98
98
|
- spec/springboard/client_spec.rb
|
99
99
|
- springboard-retail.gemspec
|
100
100
|
- vendor/cache/addressable-2.2.8.gem
|
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: 1.3.6
|
147
147
|
requirements: []
|
148
148
|
rubyforge_project:
|
149
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.7.6
|
150
150
|
signing_key:
|
151
151
|
specification_version: 4
|
152
152
|
summary: Springboard Retail API client library
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Springboard
|
2
|
-
class Client
|
3
|
-
##
|
4
|
-
# Extensions to the Addressable::URI class.
|
5
|
-
module URIExt
|
6
|
-
##
|
7
|
-
# Returns a new URI with the given subpath appended to it. Ensures a single
|
8
|
-
# forward slash between the URI's path and the given subpath.
|
9
|
-
def subpath(subpath)
|
10
|
-
uri = dup
|
11
|
-
uri.path = "#{path}/" unless path.end_with?('/')
|
12
|
-
uri.join subpath.to_s.gsub(/^\//, '')
|
13
|
-
end
|
14
|
-
|
15
|
-
##
|
16
|
-
# Merges the given hash of query string parameters and values with the URI's
|
17
|
-
# existing query string parameters (if any).
|
18
|
-
def merge_query_values!(values)
|
19
|
-
self.springboard_query_values = (self.query_values || {}).merge(normalize_query_hash(values))
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def springboard_query_values=(values)
|
25
|
-
retval = self.query_values = normalize_query_hash(values)
|
26
|
-
# Hack to strip digits from Addressable::URI's subscript notation
|
27
|
-
self.query = self.query.gsub(/\[\d+\]=/, '[]=')
|
28
|
-
retval
|
29
|
-
end
|
30
|
-
|
31
|
-
def normalize_query_hash(hash)
|
32
|
-
hash.inject({}) do |copy, (k, v)|
|
33
|
-
copy[k.to_s] = case v
|
34
|
-
when Hash then normalize_query_hash(v)
|
35
|
-
when true, false then v.to_s
|
36
|
-
else v end
|
37
|
-
copy
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
##
|
45
|
-
# We include Springboard::Client::URIExt into Addressable::URI because its design
|
46
|
-
# doesn't support subclassing.
|
47
|
-
#
|
48
|
-
# @see http://addressable.rubyforge.org/api/Addressable/URI.html Addressable::URI docs
|
49
|
-
class Addressable::URI
|
50
|
-
include Springboard::Client::URIExt
|
51
|
-
end
|