ebay_request 0.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.
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ class EbayRequest::Shopping < EbayRequest::Base
3
+ private
4
+
5
+ def payload(callname, request)
6
+ request = Gyoku.xml(request)
7
+
8
+ %(<?xml version="1.0" encoding="utf-8"?>\
9
+ <#{callname}Request xmlns="urn:ebay:apis:eBLBaseComponents">\
10
+ #{request}</#{callname}Request>)
11
+ end
12
+
13
+ def endpoint
14
+ "http://open.api%{sandbox}.ebay.com/shopping"
15
+ end
16
+
17
+ def headers(callname)
18
+ super.merge(
19
+ "Content-Type" => "text/xml",
20
+ "X-EBAY-API-APP-ID" => config.appid,
21
+ "X-EBAY-API-VERSION" => config.version.to_s,
22
+ "X-EBAY-API-CALL-NAME" => callname,
23
+ "X-EBAY-API-REQUEST-ENCODING" => "XML",
24
+ "X-EBAY-API-SITE-ID" => siteid.to_s
25
+ )
26
+ end
27
+
28
+ def errors_for(r)
29
+ [r["Errors"]]
30
+ .flatten
31
+ .compact
32
+ .map { |e| [e["SeverityCode"], e["ErrorCode"], e["LongMessage"]] }
33
+ end
34
+
35
+ FATAL_ERRORS = {}.freeze
36
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ class EbayRequest::Site
3
+ KEYS = %w(
4
+ globalid id name currency language domain code metric country gtc_available
5
+ free_placement max_insertion_fee free_pictures subtitle_fee quantity_limits
6
+ min_fixed_price
7
+ ).freeze
8
+
9
+ attr_reader(*KEYS)
10
+
11
+ def initialize(hash)
12
+ @hash = hash
13
+ KEYS.each { |key| instance_variable_set(:"@#{key}", hash[key]) }
14
+ end
15
+
16
+ def to_hash
17
+ @hash
18
+ end
19
+ alias to_h to_hash
20
+
21
+ def gtc_available?
22
+ return @gtc_available if [true, false].include? @gtc_available
23
+
24
+ raise <<-MESSAGE.gsub(/^ +\|/, "")
25
+ |We haven't checked whether GTC duration is available on the site #{@id}.
26
+ |You should explore if GTC is supported by at least one of its categories (see https://developer.ebay.com/devzone/xml/docs/reference/ebay/GetCategoryFeatures.html)
27
+ |Then you're welcome to make a PR with a resulting value (true|false) added to `config/sites.yml`
28
+ MESSAGE
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+ class EbayRequest::Trading < EbayRequest::Base
3
+ class IllegalItemStateError < EbayRequest::Error; end
4
+ class ItemLimitReachedError < EbayRequest::Error; end
5
+ class DailyItemCallLimitReachedError < EbayRequest::Error; end
6
+ class TokenValidationFailed < EbayRequest::Error; end
7
+ class IAFTokenExpired < TokenValidationFailed; end
8
+ class AccountSuspended < EbayRequest::Error; end
9
+ class ApplicationInvalid < EbayRequest::Error; end
10
+
11
+ private
12
+
13
+ def payload(callname, request)
14
+ request = Gyoku.xml(request, key_converter: :camelcase)
15
+
16
+ %(<?xml version="1.0" encoding="utf-8"?>\
17
+ <#{callname}Request xmlns="urn:ebay:apis:eBLBaseComponents">\
18
+ #{creds}#{request}</#{callname}Request>)
19
+ end
20
+
21
+ def creds
22
+ return if options[:token].nil? || options[:iaf_token_manager].present?
23
+ %(<RequesterCredentials>\
24
+ <eBayAuthToken>#{options[:token]}</eBayAuthToken>\
25
+ </RequesterCredentials>)
26
+ end
27
+
28
+ def endpoint
29
+ "https://api%{sandbox}.ebay.com/ws/api.dll"
30
+ end
31
+
32
+ def headers(callname)
33
+ authorized_headers = {
34
+ "Content-Type" => "text/xml",
35
+ "X-EBAY-API-APP-NAME" => config.appid,
36
+ "X-EBAY-API-DEV-NAME" => config.devid,
37
+ "X-EBAY-API-CERT-NAME" => config.certid,
38
+ "X-EBAY-API-COMPATIBILITY-LEVEL" => config.version.to_s,
39
+ "X-EBAY-API-CALL-NAME" => callname,
40
+ "X-EBAY-API-SITEID" => siteid.to_s,
41
+ }
42
+ if options[:iaf_token_manager]
43
+ authorized_headers["X-EBAY-API-IAF-TOKEN"] =
44
+ options[:iaf_token_manager].access_token
45
+ end
46
+ super.merge(authorized_headers)
47
+ end
48
+
49
+ def errors_for(r)
50
+ [r["Errors"]]
51
+ .flatten
52
+ .compact
53
+ .map { |e| [e["SeverityCode"], e["ErrorCode"], e["LongMessage"]] }
54
+ end
55
+
56
+ def request(*)
57
+ retried ||= false
58
+ super.tap do |response|
59
+ next if retried || options[:iaf_token_manager].nil?
60
+ next if response.success? || response.error_class > IAFTokenExpired
61
+ raise response.error
62
+ end
63
+ rescue IAFTokenExpired
64
+ options[:iaf_token_manager].refresh!
65
+ retried = true
66
+ retry
67
+ end
68
+
69
+ # http://developer.ebay.com/devzone/xml/docs/reference/ebay/errors/errormessages.htm
70
+ FATAL_ERRORS = {
71
+ 291 => IllegalItemStateError,
72
+ 1047 => IllegalItemStateError,
73
+ 21_919_188 => ItemLimitReachedError,
74
+ 21_919_165 => DailyItemCallLimitReachedError,
75
+ 931 => TokenValidationFailed,
76
+ 17_470 => TokenValidationFailed,
77
+ 16_110 => TokenValidationFailed,
78
+ 21_916_984 => TokenValidationFailed,
79
+ 21_917_053 => IAFTokenExpired,
80
+ 841 => AccountSuspended,
81
+ 127 => ApplicationInvalid
82
+ }.freeze
83
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module EbayRequest
3
+ VERSION = "0.2.0"
4
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ class OmniAuth::Strategies::Ebay
3
+ include OmniAuth::Strategy
4
+
5
+ args [:runame, :devid, :appid, :certid]
6
+
7
+ option :runame, nil
8
+ option :devid, nil
9
+ option :appid, nil
10
+ option :certid, nil
11
+ option :site_id, "0"
12
+ option :sandbox, true
13
+ option :env, nil
14
+
15
+ uid { raw_info["EIASToken"] }
16
+ credentials { { token: @auth_token, expires_at: @expires_at } }
17
+ extra { { raw_info: raw_info } }
18
+
19
+ info do
20
+ {
21
+ user_id: raw_info["UserID"],
22
+ auth_token: @auth_token,
23
+ email: raw_info["Email"],
24
+ full_name: full_name,
25
+ first_name: parsed_name[0],
26
+ last_name: parsed_name[1],
27
+ eias_token: raw_info["EIASToken"]
28
+ }
29
+ end
30
+
31
+ def request_phase
32
+ configure unless EbayRequest.configured?
33
+ session["omniauth.ebay.session_id"] = fetch_session_id
34
+ redirect ebay.ebay_login_url(session["omniauth.ebay.session_id"])
35
+ end
36
+
37
+ def callback_phase
38
+ response = fetch_token
39
+
40
+ @auth_token = response["eBayAuthToken"]
41
+ @expires_at = Time.parse(response["HardExpirationTime"]).to_i
42
+ @user_info = ebay.user(@auth_token)
43
+
44
+ super
45
+ end
46
+
47
+ def configure
48
+ EbayRequest.configure(options.env) do |config|
49
+ config.runame = options.runame
50
+ config.devid = options.devid
51
+ config.appid = options.appid
52
+ config.certid = options.certid
53
+ config.sandbox = options.sandbox
54
+ end
55
+ end
56
+
57
+ def raw_info
58
+ @user_info["User"]
59
+ end
60
+
61
+ def full_name
62
+ @full_name ||= raw_info["RegistrationAddress"].try(:[], "Name")
63
+ end
64
+
65
+ def parsed_name
66
+ @parsed_name ||= (full_name || "").split(" ", 2)
67
+ end
68
+
69
+ def ebay
70
+ @ebay ||= EbayRequest::Auth.new(site_id: options.site_id, env: options.env)
71
+ end
72
+
73
+ def fetch_token
74
+ ebay.token(session["omniauth.ebay.session_id"])
75
+ end
76
+
77
+ def fetch_session_id
78
+ ebay.session_id["SessionID"]
79
+ end
80
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ebay_request
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Victor Sokolov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: multi_xml
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: gyoku
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: omniauth
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: dry-initializer
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description:
154
+ email:
155
+ - gzigzigzeo@evilmartians.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".rubocop.yml"
163
+ - ".travis.yml"
164
+ - Gemfile
165
+ - README.md
166
+ - Rakefile
167
+ - bin/console
168
+ - bin/setup
169
+ - config/sites.yml
170
+ - ebay_request.gemspec
171
+ - lib/ebay_request.rb
172
+ - lib/ebay_request/auth.rb
173
+ - lib/ebay_request/base.rb
174
+ - lib/ebay_request/business_policies.rb
175
+ - lib/ebay_request/config.rb
176
+ - lib/ebay_request/error.rb
177
+ - lib/ebay_request/finding.rb
178
+ - lib/ebay_request/response.rb
179
+ - lib/ebay_request/shopping.rb
180
+ - lib/ebay_request/site.rb
181
+ - lib/ebay_request/trading.rb
182
+ - lib/ebay_request/version.rb
183
+ - lib/omniauth/strategies/ebay.rb
184
+ homepage: https://github.com/gzigzigzeo/ebay_request
185
+ licenses: []
186
+ metadata:
187
+ allowed_push_host: https://rubygems.org
188
+ post_install_message:
189
+ rdoc_options: []
190
+ require_paths:
191
+ - lib
192
+ required_ruby_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ required_rubygems_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ requirements: []
203
+ rubyforge_project:
204
+ rubygems_version: 2.7.6
205
+ signing_key:
206
+ specification_version: 4
207
+ summary: eBay API request interface
208
+ test_files: []