etsy 0.2.6 → 0.2.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 +4 -4
- data/.travis.yml +1 -2
- data/README.md +11 -44
- data/lib/etsy/response.rb +10 -3
- data/lib/etsy/version.rb +1 -1
- data/lib/etsy.rb +28 -9
- data/test/unit/etsy/response_test.rb +3 -2
- data/test/unit/etsy_test.rb +55 -11
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0417646d0a3bad8aac70e2fe86cf6904fd5803b
|
4
|
+
data.tar.gz: ce49ace0289086a486b2e1a0185232bb444653cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41647ccad160295f3fd4143db22264b3f051c45b7d9254ceabcc8ae65ae130d571a3eae7f2500752fedbcb408d1b05e51e0966ba0f4643091ff211f384c4726d
|
7
|
+
data.tar.gz: a9d658cc135a7acdb17b55a086b3c65fdf378afb538c7fc7a4b97f2996d9369604f5dd7b78d95706c248e76649459b8b25b1422d7b3066df100dacdac65b5e6d
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -45,7 +45,6 @@ The Etsy API has support for both retrieval of extended information and write su
|
|
45
45
|
|
46
46
|
For simple authentication from the console, configure the necessary parameters:
|
47
47
|
|
48
|
-
require 'rubygems'
|
49
48
|
require 'etsy'
|
50
49
|
|
51
50
|
Etsy.api_key = 'key'
|
@@ -72,7 +71,6 @@ Authenticated calls can now be made by passing an access token and secret:
|
|
72
71
|
|
73
72
|
The process for authenticating via a web application is similar, but requires the configuration of a callback URL:
|
74
73
|
|
75
|
-
require 'rubygems'
|
76
74
|
require 'etsy'
|
77
75
|
|
78
76
|
Etsy.api_key = 'key'
|
@@ -102,14 +100,21 @@ to the verification URL. A simple example using Sinatra:
|
|
102
100
|
|
103
101
|
### Environment
|
104
102
|
|
105
|
-
The Etsy API
|
103
|
+
The Etsy API previously had both a sandbox environment and a production environment. They have recently eliminated the sandbox environment, but the ability to set the environment has been preserved in case it is implemented in v3.
|
106
104
|
|
107
|
-
If nothing is set, the default is :
|
105
|
+
If nothing is set, the default is :production.
|
108
106
|
|
109
107
|
You can set this using:
|
110
108
|
|
111
109
|
Etsy.environment = :production
|
112
110
|
|
111
|
+
## Error handling
|
112
|
+
|
113
|
+
For legacy reasons, this gem does *not* raise errors when requests are unsuccessful.
|
114
|
+
However, you can force errors to be thrown by configuring the `silent_errors` flag.
|
115
|
+
|
116
|
+
>>> Etsy.silent_errors = false
|
117
|
+
|
113
118
|
## DSL
|
114
119
|
|
115
120
|
Use the Etsy::Request class to make flexible calls to the API.
|
@@ -223,7 +228,7 @@ If you want a more fine-grained response, you can specify the associations as an
|
|
223
228
|
|
224
229
|
## Public mode vs authenticated calls
|
225
230
|
|
226
|
-
This additional example should make clear the difference between issuing public versus authenticated requests:
|
231
|
+
This additional example should make clear the difference between issuing public versus authenticated requests:
|
227
232
|
|
228
233
|
### Public workflow
|
229
234
|
|
@@ -238,46 +243,7 @@ This additional example should make clear the difference between issuing public
|
|
238
243
|
>> user = Etsy.myself(token, secret)
|
239
244
|
>> access = { :access_token => user.token, :access_secret => user.secret }
|
240
245
|
>> Etsy::Listing.find_all_by_shop_id(user.shop.id, access.merge(:limit => 5))
|
241
|
-
|
242
|
-
## Error handling
|
243
|
-
|
244
|
-
Next versions of this gem will raise errors when requests are unsuccessful. The current version does not.
|
245
|
-
Use either of following workarounds:
|
246
|
-
|
247
|
-
### Low-level API
|
248
|
-
|
249
|
-
Instead of doing this:
|
250
|
-
|
251
|
-
>> Etsy::Request.get('/users/__SELF__', access).result
|
252
|
-
|
253
|
-
Write this:
|
254
|
-
|
255
|
-
>> Etsy::Request.get('/users/__SELF__', access).to_hash["results"]
|
256
|
-
|
257
|
-
### Monkey patch
|
258
|
-
|
259
|
-
This is Ruby, reopen the <code>Response</code> class anywhere in your codebase and redefine <code>result</code>:
|
260
|
-
|
261
|
-
class Etsy::Response
|
262
|
-
def result
|
263
|
-
if success?
|
264
|
-
results = to_hash['results'] || []
|
265
|
-
count == 1 ? results.first : results
|
266
|
-
else
|
267
|
-
validate!
|
268
|
-
end
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
### Usage
|
273
|
-
|
274
|
-
With the above in place, you can now rescue errors and act upon them:
|
275
246
|
|
276
|
-
begin
|
277
|
-
Etsy.myself(access.token, access.secret)
|
278
|
-
rescue Etsy::OAuthTokenRevoked, Etsy::InvalidUserID, Etsy::MissingShopID, Etsy::EtsyJSONInvalid, Etsy::TemporaryIssue => e
|
279
|
-
puts e.message
|
280
|
-
end
|
281
247
|
|
282
248
|
## Contributing
|
283
249
|
|
@@ -321,6 +287,7 @@ These people have helped make the Etsy gem what it is today:
|
|
321
287
|
* [Jimmy Tang](https://github.com/jimmytang)
|
322
288
|
* [Julio Santos](https://github.com/julio)
|
323
289
|
* [Roger Smith](https://github.com/rogsmith)
|
290
|
+
* [Daniel Szmulewicz](https://github.com/danielsz)
|
324
291
|
|
325
292
|
### Github Flow
|
326
293
|
|
data/lib/etsy/response.rb
CHANGED
@@ -2,11 +2,18 @@ module Etsy
|
|
2
2
|
|
3
3
|
class OAuthTokenRevoked < StandardError; end
|
4
4
|
class MissingShopID < StandardError; end
|
5
|
-
class EtsyJSONInvalid < StandardError; end
|
6
5
|
class TemporaryIssue < StandardError; end
|
7
6
|
class ResourceUnavailable < TemporaryIssue; end
|
8
7
|
class ExceededRateLimit < TemporaryIssue; end
|
9
8
|
class InvalidUserID < StandardError; end
|
9
|
+
class EtsyJSONInvalid < StandardError
|
10
|
+
attr_reader :code, :data
|
11
|
+
def initialize(args)
|
12
|
+
@code = args[:code]
|
13
|
+
@data = args[:data]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
10
17
|
|
11
18
|
# = Response
|
12
19
|
#
|
@@ -48,7 +55,7 @@ module Etsy
|
|
48
55
|
results = to_hash['results'] || []
|
49
56
|
count == 1 ? results.first : results
|
50
57
|
else
|
51
|
-
[]
|
58
|
+
Etsy.silent_errors ? [] : validate!
|
52
59
|
end
|
53
60
|
end
|
54
61
|
|
@@ -82,7 +89,7 @@ module Etsy
|
|
82
89
|
raise TemporaryIssue if temporary_etsy_issue?
|
83
90
|
raise ResourceUnavailable if resource_unavailable?
|
84
91
|
raise ExceededRateLimit if exceeded_rate_limit?
|
85
|
-
raise EtsyJSONInvalid.new(
|
92
|
+
raise EtsyJSONInvalid.new({:code => code, :data => data}) unless valid_json?
|
86
93
|
true
|
87
94
|
end
|
88
95
|
|
data/lib/etsy/version.rb
CHANGED
data/lib/etsy.rb
CHANGED
@@ -67,20 +67,24 @@ module Etsy
|
|
67
67
|
attr_writer :permission_scopes
|
68
68
|
end
|
69
69
|
|
70
|
-
# Make Etsy.api_key and Etsy.api_secret
|
70
|
+
# Make Etsy.api_key and Etsy.api_secret global but also local to threads
|
71
71
|
#
|
72
72
|
def self.api_key
|
73
|
-
Thread.current[:etsy_api_key]
|
73
|
+
Thread.current[:etsy_api_key] || @api_key
|
74
74
|
end
|
75
75
|
|
76
|
-
def self.api_key=(
|
77
|
-
|
76
|
+
def self.api_key=(key)
|
77
|
+
@api_key ||= key
|
78
|
+
Thread.current[:etsy_api_key] = key
|
78
79
|
end
|
80
|
+
|
79
81
|
def self.api_secret
|
80
|
-
Thread.current[:etsy_api_secret]
|
82
|
+
Thread.current[:etsy_api_secret] || @api_secret
|
81
83
|
end
|
82
|
-
|
83
|
-
|
84
|
+
|
85
|
+
def self.api_secret=(secret)
|
86
|
+
@api_secret ||= secret
|
87
|
+
Thread.current[:etsy_api_secret] = secret
|
84
88
|
end
|
85
89
|
|
86
90
|
SANDBOX_HOST = 'sandbox.openapi.etsy.com'
|
@@ -104,6 +108,15 @@ module Etsy
|
|
104
108
|
@protocol = protocol.to_s
|
105
109
|
end
|
106
110
|
|
111
|
+
# Allow throwing API errors
|
112
|
+
#
|
113
|
+
def self.silent_errors=(bool)
|
114
|
+
unless [TrueClass, FalseClass].include?(bool.class)
|
115
|
+
raise(ArgumentError, "Silent errors must be set to either true or false'")
|
116
|
+
end
|
117
|
+
@silent_errors = bool
|
118
|
+
end
|
119
|
+
|
107
120
|
def self.protocol
|
108
121
|
@protocol || "https"
|
109
122
|
end
|
@@ -111,11 +124,17 @@ module Etsy
|
|
111
124
|
# The currently configured environment.
|
112
125
|
#
|
113
126
|
def self.environment
|
114
|
-
@environment || :
|
127
|
+
@environment || :production
|
128
|
+
end
|
129
|
+
|
130
|
+
# The default will change to false for a 1.0 release (breaking changes)
|
131
|
+
#
|
132
|
+
def self.silent_errors
|
133
|
+
@silent_errors.nil? ? true : @silent_errors
|
115
134
|
end
|
116
135
|
|
117
136
|
def self.host # :nodoc:
|
118
|
-
@host ||
|
137
|
+
@host || PRODUCTION_HOST
|
119
138
|
end
|
120
139
|
|
121
140
|
# The configured callback URL or 'oob' if no callback URL is configured. This controls
|
@@ -80,8 +80,9 @@ module Etsy
|
|
80
80
|
raw_response.stubs(:body => "I am not JSON", :code => 500)
|
81
81
|
r = Response.new(raw_response)
|
82
82
|
|
83
|
-
|
84
|
-
|
83
|
+
exception = assert_raises(Etsy::EtsyJSONInvalid) { r.to_hash }
|
84
|
+
assert_equal( 500, exception.code )
|
85
|
+
assert_equal( "I am not JSON", exception.data )
|
85
86
|
end
|
86
87
|
|
87
88
|
should "raise OAuthTokenRevoked" do
|
data/test/unit/etsy_test.rb
CHANGED
@@ -12,6 +12,7 @@ class EtsyTest < Test::Unit::TestCase
|
|
12
12
|
Etsy.instance_variable_set(:@api_key, nil)
|
13
13
|
Etsy.instance_variable_set(:@api_secret, nil)
|
14
14
|
Etsy.instance_variable_set(:@permission_scopes, nil)
|
15
|
+
Etsy.instance_variable_set(:@silent_errors, nil)
|
15
16
|
end
|
16
17
|
|
17
18
|
should "be able to set and retrieve the API key" do
|
@@ -19,6 +20,41 @@ class EtsyTest < Test::Unit::TestCase
|
|
19
20
|
Etsy.api_key.should == 'key'
|
20
21
|
end
|
21
22
|
|
23
|
+
should "be able to set and retrieve the API key across threads (global)" do
|
24
|
+
Etsy.api_key = 'key'
|
25
|
+
Thread.new do
|
26
|
+
Etsy.api_key.should == 'key'
|
27
|
+
end.join
|
28
|
+
end
|
29
|
+
|
30
|
+
should "be able to set and retrieve the API key inside a thread (thread local)" do
|
31
|
+
Etsy.api_key = 'key'
|
32
|
+
Thread.new do
|
33
|
+
Etsy.api_key = 'thread_local_key'
|
34
|
+
Etsy.api_key.should == 'thread_local_key'
|
35
|
+
end.join
|
36
|
+
end
|
37
|
+
|
38
|
+
should "be able to set and retrieve the API secret" do
|
39
|
+
Etsy.api_secret = 'secret'
|
40
|
+
Etsy.api_secret.should == 'secret'
|
41
|
+
end
|
42
|
+
|
43
|
+
should "be able to set and retrieve the API secret across threads (global)" do
|
44
|
+
Etsy.api_secret = 'secret'
|
45
|
+
Thread.new do
|
46
|
+
Etsy.api_secret.should == 'secret'
|
47
|
+
end.join
|
48
|
+
end
|
49
|
+
|
50
|
+
should "be able to set and retrieve the API secret inside a thread (thread local)" do
|
51
|
+
Etsy.api_secret = 'secret'
|
52
|
+
Thread.new do
|
53
|
+
Etsy.api_secret = 'thread_local_secret'
|
54
|
+
Etsy.api_secret.should == 'thread_local_secret'
|
55
|
+
end.join
|
56
|
+
end
|
57
|
+
|
22
58
|
should "be able to find a user by username" do
|
23
59
|
user = stub()
|
24
60
|
|
@@ -39,22 +75,30 @@ class EtsyTest < Test::Unit::TestCase
|
|
39
75
|
lambda { Etsy.protocol = :invalid }.should raise_error(ArgumentError)
|
40
76
|
end
|
41
77
|
|
42
|
-
should "use
|
43
|
-
Etsy.
|
78
|
+
should "use silent errors by default" do
|
79
|
+
Etsy.silent_errors.should == true
|
44
80
|
end
|
45
81
|
|
46
|
-
should "be able to set
|
47
|
-
Etsy.
|
82
|
+
should "be able to set silent errors to a valid value" do
|
83
|
+
Etsy.silent_errors = false
|
84
|
+
Etsy.silent_errors.should == false
|
85
|
+
end
|
86
|
+
|
87
|
+
should "raise an exception when attempting to set an invalid silent errors value" do
|
88
|
+
lambda { Etsy.silent_errors = :invalid }.should raise_error(ArgumentError)
|
89
|
+
end
|
90
|
+
|
91
|
+
should "use the production environment by default" do
|
48
92
|
Etsy.environment.should == :production
|
49
93
|
end
|
50
94
|
|
51
|
-
should "
|
52
|
-
|
95
|
+
should "be able to set the environment to a valid value" do
|
96
|
+
Etsy.environment = :sandbox
|
97
|
+
Etsy.environment.should == :sandbox
|
53
98
|
end
|
54
99
|
|
55
|
-
should "
|
56
|
-
Etsy.
|
57
|
-
Etsy.api_secret.should == 'secret'
|
100
|
+
should "raise an exception when attempting to set an invalid environment" do
|
101
|
+
lambda { Etsy.environment = :invalid }.should raise_error(ArgumentError)
|
58
102
|
end
|
59
103
|
|
60
104
|
should "know the host for the sandbox environment" do
|
@@ -67,8 +111,8 @@ class EtsyTest < Test::Unit::TestCase
|
|
67
111
|
Etsy.host.should == 'openapi.etsy.com'
|
68
112
|
end
|
69
113
|
|
70
|
-
should "default to
|
71
|
-
Etsy.host.should == '
|
114
|
+
should "default to production host" do
|
115
|
+
Etsy.host.should == 'openapi.etsy.com'
|
72
116
|
end
|
73
117
|
|
74
118
|
should "be able to set the callback url" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etsy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Reagan
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-06-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -214,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
214
|
version: '0'
|
215
215
|
requirements: []
|
216
216
|
rubyforge_project:
|
217
|
-
rubygems_version: 2.2.
|
217
|
+
rubygems_version: 2.2.2
|
218
218
|
signing_key:
|
219
219
|
specification_version: 4
|
220
220
|
summary: Provides a friendly ruby-like wrapper for the Etsy API
|
@@ -268,3 +268,4 @@ test_files:
|
|
268
268
|
- test/unit/etsy/user_test.rb
|
269
269
|
- test/unit/etsy/verification_request_test.rb
|
270
270
|
- test/unit/etsy_test.rb
|
271
|
+
has_rdoc:
|