ebay_client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTQzYjA2ZmUwYzllYmJiNmNlOWQxMWRlZTVmYzk3M2MzODVlMmRkNg==
5
+ data.tar.gz: !binary |-
6
+ MWFjZWIyZWQwMmM1ZTE0MGZjYjY2N2UxYTI1OTM1YjRmODNkM2Q1Mg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NmY3NGI2MjllOWNmY2U0MDk5NzZmNTQzMDgxNTI3NjI5ZDc4N2NjYTAwYTg3
10
+ ODMyMjk4MWVjYzA2MDA4MjA3NGQ3NTI3ZmY1NTVkNzFlNjkwMjZjZTA0ZjAy
11
+ Y2Y2ODFiM2M0MzY4MTExNTJmOGExZDdlNTg0MGU0Yzc2MjFiZDA=
12
+ data.tar.gz: !binary |-
13
+ MTg2NjZmMGY2YjVmZmUzMWI4OTM4ZWJhNWUxYzQ3ZTFhYzY4MjJlMTBjYTQx
14
+ NTQ1NDQ3NmNiNWM3NDJkMGQ5ZDMwZTU3YjJiYTZjMTA5YTliZmM4NDQ0OTUz
15
+ N2I0YjQ3ZGY4ZWZjNjZkZTZhMDM0YWVkZmY5Zjg2YmNhNDM3N2E=
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .bundle/
2
+ .project
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,51 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ebay_client (0.0.1)
5
+ activesupport (>= 3.1.0)
6
+ savon (~> 0.9.9)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ activesupport (3.2.3)
12
+ i18n (~> 0.6)
13
+ multi_json (~> 1.0)
14
+ akami (1.0.0)
15
+ gyoku (>= 0.4.0)
16
+ builder (3.0.0)
17
+ columnize (0.3.6)
18
+ debugger (1.1.1)
19
+ columnize (>= 0.3.1)
20
+ debugger-linecache (~> 1.1)
21
+ debugger-ruby_core_source (~> 1.1)
22
+ debugger-linecache (1.1.1)
23
+ debugger-ruby_core_source (>= 1.1.1)
24
+ debugger-ruby_core_source (1.1.2)
25
+ gyoku (0.4.4)
26
+ builder (>= 2.1.2)
27
+ httpi (0.9.6)
28
+ rack
29
+ i18n (0.6.0)
30
+ multi_json (1.3.2)
31
+ nokogiri (1.5.2)
32
+ nori (1.1.0)
33
+ rack (1.4.1)
34
+ savon (0.9.9)
35
+ akami (~> 1.0)
36
+ builder (>= 2.1.2)
37
+ gyoku (>= 0.4.0)
38
+ httpi (~> 0.9)
39
+ nokogiri (>= 1.4.0)
40
+ nori (~> 1.1)
41
+ wasabi (~> 2.1)
42
+ wasabi (2.1.0)
43
+ nokogiri (>= 1.4.0)
44
+
45
+ PLATFORMS
46
+ ruby
47
+
48
+ DEPENDENCIES
49
+ bundler
50
+ debugger
51
+ ebay_client!
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2012 ['Kayoom GmbH Düren, Germany', 'Marian Theisen'],
2
+ except 'vendor/ebay/*.wsdl', Copyright (c) eBay
3
+
4
+ Permission is hereby granted, free of charge, to any person
5
+ obtaining a copy of this software and associated documentation
6
+ files (the "Software"), to deal in the Software without
7
+ restriction, including without limitation the rights to use,
8
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the
10
+ Software is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ EbayClient
2
+ ==========
3
+
4
+ Simple, lightweight eBay Trading API Client.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ ### Rails
10
+
11
+ `Gemfile`:
12
+
13
+ gem 'ebay_client', '~> 0.1.0'
14
+
15
+ `config/ebay_client.yml`:
16
+
17
+ development: &sandbox
18
+ api_keys:
19
+ - token: '<YOUR SANDBOX AUTHENTICATION TOKEN>'
20
+ devid: '<YOUR SANDBOX DEV ID>'
21
+ appid: '<YOUR SANDBOX APP ID>'
22
+ certid: '<YOUR SANDBOX CERT ID>'
23
+
24
+ test:
25
+ <<: *sandbox
26
+
27
+ production:
28
+ api_keys:
29
+ - token: '<YOUR LIVE AUTHENTICATION TOKEN>'
30
+ devid: '<YOUR LIVE DEV ID>'
31
+ appid: '<YOUR LIVE APP ID>'
32
+ certid: '<YOUR LIVE CERT ID>'
33
+
34
+ Fire up your console!
35
+
36
+ Usage
37
+ -----
38
+
39
+ ### Rails
40
+
41
+ e.g. `rails console`:
42
+
43
+ EbayClient.api.get_ebay_official_time!
44
+ # => {:timestamp=>Fri, 22 Nov 2013 12:31:02 +0000}
45
+
46
+ Notes
47
+ -----
48
+ * An overview of possible API calls can be found at the
49
+ [eBay Trading API docs](http://developer.ebay.com/DevZone/XML/docs/Reference/eBay/)
50
+ * Names (Methods, Types, Members) are mapped from `CamelCase` \<=\> `snake_case`
51
+ * `eBay` is mapped to `ebay`, i.e. `GeteBayOfficialTime` \<=\>
52
+ `get_ebay_official_time`
53
+ * For each call, there are 2 methods, with and without a bang (`!`), i.e.
54
+ * `get_ebay_official_time` returns an `EbayClient::Response`
55
+ instance, which contains the `ack` value, the `payload` and possibly
56
+ `errors`
57
+ * `get_ebay_official_time!` returns the payload as a `Hash` and raises
58
+ an `EbayClient::Response::Exception` if the API returned an error.
59
+ * You can specify an arbitrary amount of API key/tokens in your
60
+ `ebay_client.yml`. On initialization, the EbayClient will randomly
61
+ choose one of them. If you run out of API calls, it will automatically
62
+ switch to another key.
63
+ * Pull requests and bug reports are welcome!
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'rake'
2
+ require 'rake/rdoctask'
3
+ require 'bundler'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+
@@ -0,0 +1,25 @@
1
+ defaults: &defaults
2
+ version: 809
3
+ # use local file as default
4
+ #wsdl_file: 'http://developer.ebay.com/webservices/809/eBaySvc.wsdl'
5
+ routing: default
6
+ siteid: 0
7
+ preload: false
8
+ warning_level: Low
9
+ error_language: en_US
10
+ api_keys: []
11
+ savon_log_level: debug
12
+
13
+ development: &development
14
+ <<: *defaults
15
+ url: 'https://api.sandbox.ebay.com/wsapi'
16
+ warning_level: High
17
+ savon_log_level: info
18
+
19
+ test:
20
+ <<: *development
21
+
22
+ production:
23
+ <<: *defaults
24
+ url: 'https://api.ebay.com/wsapi'
25
+ preload: true
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "ebay_client/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "ebay_client"
7
+ s.version = EbayClient::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.date = Time.now.strftime("%Y-%m-%d")
10
+ s.authors = ["Marian Theisen"]
11
+ s.email = 'marian.theisen@kayoom.com'
12
+ s.summary = "Ebay Trading API Client"
13
+ s.homepage = "http://github.com/kayoom/ebay_client"
14
+ s.description = "Simple, lightweight eBay Trading API Client"
15
+ s.license = "MIT"
16
+ s.metadata = {
17
+ 'issue_tracker' => 'https://github.com/kayoom/ebay_client/issues'
18
+ }
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+
25
+ s.add_dependency "activesupport", ">= 3.1.0"
26
+ s.add_dependency "savon", "< 2.0.0"
27
+
28
+ s.add_development_dependency "bundler"
29
+ end
@@ -0,0 +1,11 @@
1
+ require 'ebay_client/version'
2
+ require 'ebay_client/engine' if defined?(::Rails)
3
+
4
+ module EbayClient
5
+ autoload :Configuration, 'ebay_client/configuration'
6
+ autoload :Api, 'ebay_client/api'
7
+ autoload :Endpoint, 'ebay_client/endpoint'
8
+ autoload :Header, 'ebay_client/header'
9
+ autoload :Request, 'ebay_client/request'
10
+ autoload :Response, 'ebay_client/response'
11
+ end
@@ -0,0 +1,68 @@
1
+ require 'savon'
2
+ require 'gyoku'
3
+ require 'ebay_client/response'
4
+
5
+ class EbayClient::Api < ActiveSupport::BasicObject
6
+ attr_reader :configuration, :endpoint, :namespace, :header, :client, :calls
7
+
8
+ def initialize configuration
9
+ @configuration = configuration
10
+ @endpoint = ::EbayClient::Endpoint.new configuration
11
+ @namespace = :urn
12
+ @header = ::EbayClient::Header.new configuration, namespace
13
+ @client = ::Savon::Client.new configuration.wsdl_file
14
+ @client.http.read_timeout = 600
15
+ @calls = 0
16
+
17
+ ::Gyoku.convert_symbols_to :camelcase
18
+ create_methods if configuration.preload?
19
+ end
20
+
21
+ def dispatch name, body
22
+ request = ::EbayClient::Request.new self, name, body
23
+
24
+ @calls += 1
25
+ begin
26
+ request.execute
27
+ rescue ::EbayClient::Response::Error.for_code('218050') => e
28
+ @configuration.next_key!
29
+ request.execute
30
+ end
31
+ end
32
+
33
+ def dispatch! name, body
34
+ dispatch(name, body).payload!
35
+ end
36
+
37
+ def inspect
38
+ "<EbayClient::Api>"
39
+ end
40
+ alias_method :to_s, :inspect
41
+
42
+ protected
43
+ def create_methods
44
+ api_methods = ::Module.new
45
+
46
+ client.wsdl.soap_actions.each do |action|
47
+ name = action.to_s.gsub(/e_bay_/, '_ebay_')
48
+
49
+ api_methods.send :define_method, name do |*args|
50
+ dispatch name, args.first
51
+ end
52
+
53
+ api_methods.send :define_method, name + '!' do |*args|
54
+ dispatch! name, args.first
55
+ end
56
+ end
57
+
58
+ api_methods.send :extend_object, self
59
+ end
60
+
61
+ def method_missing name, *args, &block
62
+ if name.to_s[-1,1] == '!'
63
+ dispatch! name, args.first
64
+ else
65
+ dispatch name, args.first
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,79 @@
1
+ class EbayClient::Configuration
2
+ class ApiKey
3
+ attr_accessor :appid, :devid, :certid, :token
4
+
5
+ def initialize key_values
6
+ key_values.each do |key, val|
7
+ instance_variable_set "@#{key}", val
8
+ end
9
+ end
10
+ end
11
+
12
+ attr_accessor :version, :siteid, :routing, :url, :api_keys, :warning_level, :error_language, :current_key, :savon_log_level
13
+
14
+ def initialize presets
15
+ presets.each do |key, val|
16
+ instance_variable_set "@#{key}", val
17
+ end
18
+
19
+ @api_keys = @api_keys.map do |key_values|
20
+ ApiKey.new key_values
21
+ end.shuffle
22
+ @current_key = @api_keys.first
23
+ end
24
+
25
+ def next_key!
26
+ i = @api_keys.index(@current_key) + 1
27
+ i = 0 if i >= @api_keys.count
28
+ @current_key = @api_keys[i]
29
+ end
30
+
31
+ def appid
32
+ @current_key.appid
33
+ end
34
+
35
+ def devid
36
+ @current_key.devid
37
+ end
38
+
39
+ def certid
40
+ @current_key.certid
41
+ end
42
+
43
+ def token
44
+ @current_key.token
45
+ end
46
+
47
+ def wsdl_file
48
+ @wsdl_file ||= File.expand_path "../../../vendor/ebay/#{version}.wsdl", __FILE__
49
+ end
50
+
51
+ def preload?
52
+ !!@preload
53
+ end
54
+
55
+ class << self
56
+ def load file
57
+ defaults = load_defaults
58
+ configs = YAML.load_file file
59
+
60
+ configs.each_pair do |env, presets|
61
+ env_defaults = defaults[env] || {}
62
+ presets = presets || {}
63
+
64
+ configs[env] = new env_defaults.merge(presets)
65
+ end
66
+
67
+ configs
68
+ end
69
+
70
+ protected
71
+ def load_defaults
72
+ YAML.load_file defaults_file
73
+ end
74
+
75
+ def defaults_file
76
+ File.expand_path '../../../config/defaults.yml', __FILE__
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,22 @@
1
+ class EbayClient::Endpoint
2
+ attr_reader :configuration
3
+
4
+ def initialize configuration
5
+ @configuration = configuration
6
+ end
7
+
8
+ def url_for action
9
+ url_base + action.to_s
10
+ end
11
+
12
+ def url_base
13
+ @url_base ||= [
14
+ configuration.url,
15
+ params_base
16
+ ].join
17
+ end
18
+
19
+ def params_base
20
+ @params_base ||= "?appid=#{configuration.appid}&siteid=#{configuration.siteid}&version=#{configuration.version}&routing=#{configuration.routing}&callname="
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ module EbayClient
2
+ mattr_accessor :api
3
+
4
+ class Engine < ::Rails::Engine
5
+ CONFIG_FILE_PATH = %w(config ebay_client.yml)
6
+
7
+ initializer 'ebay_client.load_configuration' do
8
+ configurations = EbayClient::Configuration.load Rails.root.join(*CONFIG_FILE_PATH)
9
+ configuration = configurations[Rails.env]
10
+
11
+ EbayClient.api = EbayClient::Api.new configuration
12
+
13
+ ::Savon.configure do |config|
14
+ config.log = true
15
+ config.logger = Rails.logger
16
+ config.log_level = configuration.savon_log_level
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ class EbayClient::Header
2
+ attr_reader :configuration, :namespace
3
+
4
+ def initialize configuration, namespace
5
+ @configuration = configuration
6
+ @namespace = namespace
7
+ end
8
+
9
+ def to_hash
10
+ {
11
+ ns_key(:RequesterCredentials) => {
12
+ ns_key(:eBayAuthToken) => configuration.token,
13
+ ns_key(:Credentials) => {
14
+ ns_key(:AppId) => configuration.appid,
15
+ ns_key(:DevId) => configuration.devid,
16
+ ns_key(:AuthCert) => configuration.certid
17
+ }
18
+ }
19
+ }
20
+ end
21
+
22
+ protected
23
+ def ns_key key
24
+ "#{namespace}:#{key}"
25
+ end
26
+ end