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