reverb-api 0.1.6

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.
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://sandbox.reverb.com/api/my/listings?sku=THETESTSKU&state=all
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Content-Type:
11
+ - application/hal+json
12
+ Accept:
13
+ - application/hal+json
14
+ X-Auth-Token:
15
+ - bad_token
16
+ response:
17
+ status:
18
+ code: 401
19
+ message: Unauthorized
20
+ headers:
21
+ Cache-Control:
22
+ - no-cache
23
+ Content-Type:
24
+ - application/hal+json
25
+ Date:
26
+ - Tue, 06 Oct 2015 18:18:23 GMT
27
+ Server:
28
+ - nginx
29
+ Status:
30
+ - 401 Unauthorized
31
+ X-Request-Id:
32
+ - 6291593e-b3d4-4d4b-9106-dad6547555c3
33
+ X-Revision:
34
+ - fda6d910fe5754c2129bb9368ea10ed75fae50b3
35
+ X-Runtime:
36
+ - '0.018961'
37
+ Content-Length:
38
+ - '316'
39
+ Connection:
40
+ - keep-alive
41
+ body:
42
+ encoding: UTF-8
43
+ string: '{"message":"Please log in to view your listings.","details":"Invalid
44
+ token. Please re-authenticate to obtain X-Auth-Token header.","_links":{"email_auth":{"templated":true,"href":"/api/auth/email{?email,password}","method":"POST"},"fb_auth":{"templated":true,"href":"/api/auth/facebook{?fb_token}","method":"POST"}}}'
45
+ http_version:
46
+ recorded_at: Tue, 06 Oct 2015 18:18:23 GMT
47
+ recorded_with: VCR 2.9.3
data/lib/reverb/api.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "reverb/api/version"
2
+ require "reverb/api/client"
3
+ require "reverb/api/listing"
4
+ require "reverb/api/errors"
@@ -0,0 +1,130 @@
1
+ require "httparty"
2
+
3
+ module Reverb
4
+ module Api
5
+ class ServiceDown < RuntimeError; end
6
+ class Client
7
+
8
+ HEADERS = {
9
+ "Content-Type" => "application/hal+json",
10
+ "Accept" => "application/hal+json"
11
+ }
12
+
13
+ def default_headers
14
+ @headers ||= HEADERS.dup
15
+ end
16
+
17
+ def add_default_header(header)
18
+ default_headers.merge!(header)
19
+ end
20
+
21
+ # url: Base URL of the Reverb API (e.g.: https://reverb.com)
22
+ # basic_auth: optional basic auth for hitting Reverb Sandbox URLs
23
+ def initialize(reverb_token: nil, url: "https://reverb.com", basic_auth: nil, headers:{})
24
+ @reverb_token = reverb_token
25
+ @reverb_url = url
26
+ @basic_auth = basic_auth
27
+ default_headers.merge!(headers)
28
+ end
29
+
30
+ def authenticate(email, password)
31
+ post("/api/auth/email", email: email, password: password)
32
+ end
33
+
34
+ def create_listing(param)
35
+ post("/api/listings", param)
36
+ end
37
+
38
+ def find_listing_by_sku(sku)
39
+ find_by_sku(sku, "all")
40
+ end
41
+
42
+ def find_draft(sku)
43
+ find_by_sku(sku, "draft")
44
+ end
45
+
46
+ def create_webhook(url:, topic:)
47
+ post("/api/webhooks/registrations", url: url, topic: topic)
48
+ end
49
+
50
+ def webhooks
51
+ get("/api/webhooks/registrations")
52
+ end
53
+
54
+ def post(path, params)
55
+ handle_response HTTParty.post(url(path), with_defaults(params))
56
+ end
57
+
58
+ def get(path)
59
+ handle_response HTTParty.get(url(path), default_options)
60
+ end
61
+
62
+ def put(path, params)
63
+ handle_response HTTParty.put(url(path), with_defaults(params))
64
+ end
65
+
66
+ def delete(path, params)
67
+ handle_response HTTParty.delete(url(path), with_defaults(params))
68
+ end
69
+
70
+ private
71
+
72
+ attr_reader :basic_auth, :reverb_token, :reverb_url
73
+
74
+ def find_by_sku(sku, state)
75
+ listings = get("/api/my/listings?sku=#{CGI.escape(sku)}&state=#{state}")["listings"]
76
+ listing_attributes = listings && listings.first
77
+ if listing_attributes
78
+ Listing.new(client: self, listing_attributes: listing_attributes)
79
+ else
80
+ nil
81
+ end
82
+ end
83
+
84
+ def with_defaults(params={})
85
+ unless params.empty?
86
+ default_options.merge(body: params.to_json)
87
+ else
88
+ default_options
89
+ end
90
+ end
91
+
92
+ def url(path)
93
+ File.join(reverb_url, path)
94
+ end
95
+
96
+ def handle_response(response)
97
+ raise ServiceDown if response.code == 503
98
+ raise Reverb::Api::NotAuthorizedError.new(response.parsed_response["message"]) unless authorized?(response)
99
+ response
100
+ end
101
+
102
+ def authorized?(response)
103
+ !(response.code == 401 || response.code == 403)
104
+ end
105
+
106
+ # Tells HTTParty to parse application/hal+json as json
107
+ # All HTTParty responses will be parsed into hashes via JSON.parse
108
+ class HalParsingSupport < HTTParty::Parser
109
+ SupportedFormats.merge!(
110
+ {"application/hal+json" => :json}
111
+ )
112
+ end
113
+
114
+
115
+ def default_options
116
+ headers = default_headers.dup
117
+
118
+ # HTTParty really hates nil headers. It will die horribly
119
+ # inside of net/http with no explanation.
120
+ headers.merge!("X-Auth-Token" => reverb_token) if reverb_token
121
+
122
+ {
123
+ basic_auth: basic_auth,
124
+ headers: headers,
125
+ verify: false
126
+ }
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,9 @@
1
+ module Reverb
2
+ module Api
3
+ class NotAuthorizedError < StandardError
4
+ def initialize(message)
5
+ super(message || "Reverb authorization failed. Please check your X-Auth-Token header.")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ require "hashr"
2
+
3
+ module Reverb
4
+ module Api
5
+ class Listing < Hashr
6
+ def initialize(listing_attributes:, client:)
7
+ @client = client
8
+ super(listing_attributes)
9
+ end
10
+
11
+ def update(attributes)
12
+ client.put(_links.self.href, attributes)
13
+ end
14
+
15
+ attr_reader :client
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ module Reverb
2
+ module Api
3
+ VERSION = "0.1.6"
4
+ end
5
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'reverb/api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "reverb-api"
8
+ spec.version = Reverb::Api::VERSION
9
+ spec.authors = ["pdebelak", "skwp"]
10
+ spec.email = ["peterd@reverb.com", "yan@reverb.com"]
11
+
12
+ spec.summary = %q{Reverb API Client}
13
+ spec.description = %q{Access the Reverb API}
14
+ spec.homepage = "https://github.com/reverbdotcom/reverb-api.rb"
15
+ spec.license = "Apache License Version 2.0"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "httparty"
23
+ spec.add_dependency "hashr", "~> 1.0"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.8"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "vcr"
28
+ spec.add_development_dependency "webmock"
29
+ spec.add_development_dependency "rspec"
30
+ spec.add_development_dependency "pry"
31
+ spec.add_development_dependency "pry-nav"
32
+ end
data/script/console ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ irb -I lib -r reverb/api
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reverb-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
+ platform: ruby
6
+ authors:
7
+ - pdebelak
8
+ - skwp
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2016-02-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: hashr
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.8'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.8'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '10.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '10.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: vcr
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: webmock
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: pry
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: pry-nav
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ description: Access the Reverb API
141
+ email:
142
+ - peterd@reverb.com
143
+ - yan@reverb.com
144
+ executables: []
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".ruby-gemset"
151
+ - ".ruby-version"
152
+ - ".travis.yml"
153
+ - Gemfile
154
+ - LICENSE.txt
155
+ - README.md
156
+ - Rakefile
157
+ - bin/console
158
+ - bin/setup
159
+ - fixtures/vcr_cassettes/Reverb_Api_Client/with_valid_authentication/_find_draft/the_sku_is_not_found_on_reverb/is_nil.yml
160
+ - fixtures/vcr_cassettes/authenticate.yml
161
+ - fixtures/vcr_cassettes/create_listing.yml
162
+ - fixtures/vcr_cassettes/create_listing1.yml
163
+ - fixtures/vcr_cassettes/create_webhook.yml
164
+ - fixtures/vcr_cassettes/find_draft.yml
165
+ - fixtures/vcr_cassettes/find_listing_by_sku.yml
166
+ - fixtures/vcr_cassettes/get_webhooks.yml
167
+ - fixtures/vcr_cassettes/service_down.yml
168
+ - fixtures/vcr_cassettes/update_listing.yml
169
+ - fixtures/vcr_cassettes/wrong_auth.yml
170
+ - lib/reverb/api.rb
171
+ - lib/reverb/api/client.rb
172
+ - lib/reverb/api/errors.rb
173
+ - lib/reverb/api/listing.rb
174
+ - lib/reverb/api/version.rb
175
+ - reverb-api.gemspec
176
+ - script/console
177
+ homepage: https://github.com/reverbdotcom/reverb-api.rb
178
+ licenses:
179
+ - Apache License Version 2.0
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.4.8
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: Reverb API Client
201
+ test_files: []