ebay 0.5.2 → 0.6.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.
data/README CHANGED
@@ -1,10 +1,10 @@
1
1
 
2
2
  == Welcome to eBay4R
3
3
 
4
- eBay4R is a Ruby wrapper for eBay's Web Services SOAP API (v433). Emphasis is
4
+ eBay4R is a Ruby wrapper for eBay's Web Services SOAP API (v449). Emphasis is
5
5
  on ease of use and small footprint.
6
6
 
7
- <b>This code is currently alpha stage</b>.
7
+ <b>This code is currently beta</b>.
8
8
 
9
9
  Please report bugs and other problems, see "Author" section at the bottom.
10
10
 
@@ -117,7 +117,28 @@ This is a more complex example that performs a real (useful) function:
117
117
 
118
118
  eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
119
119
 
120
- # New method of generating complex types, needs some more testing...
120
+ # Notice how we nest hashes to mimic the XML structure of an AddItem request
121
+ resp = eBay.AddItem(:Item => { :PrimaryCategory => { :CategoryID => 57882 },
122
+ :Title => 'Mouse Pad',
123
+ :Description => 'A really cool mouse pad, you know you want it...',
124
+ :Location => 'On Earth',
125
+ :StartPrice => 12.0,
126
+ :Quantity => 1,
127
+ :ListingDuration => "Days_7",
128
+ :Country => "US",
129
+ :Currency => "USD",
130
+ :PaymentMethods => ["VisaMC", "PersonalCheck"] })
131
+
132
+ puts "New Item #" + resp.itemID + " added."
133
+
134
+ The way we nest hashes in the above AddItem() call may be confusing at first.
135
+ It is just a short-hand way of creating the complex types we need for the
136
+ call.
137
+
138
+ You may instead explicitly create the complex types (see "Creating Complex
139
+ Data Types" below) needed for the call (it makes the code longer, but a bit
140
+ more readable):
141
+
121
142
  resp = eBay.AddItem(:Item => EBay.Item(:PrimaryCategory => EBay.Category(:CategoryID => 57882),
122
143
  :Title => 'Mouse Pad',
123
144
  :Description => 'A really cool mouse pad, you know you want it...',
@@ -129,8 +150,6 @@ This is a more complex example that performs a real (useful) function:
129
150
  :Currency => "USD",
130
151
  :PaymentMethods => ["VisaMC", "PersonalCheck"]))
131
152
 
132
- puts "New Item #" + resp.itemID + " added."
133
-
134
153
 
135
154
  === Format of Requests
136
155
 
@@ -152,7 +171,7 @@ See the "eBay Web Services SOAP API Guide" for acceptable parameters and values
152
171
  for each API call. This guide can be downloaded at eBay's
153
172
  {SOAP Development Center}[http://developer.ebay.com/soap/].
154
173
 
155
- ==== Passing Complex Data Types
174
+ ==== Creating Complex Data Types
156
175
 
157
176
  A number of elements in eBay's schema are XML Schema simple types. For
158
177
  example, CategoryID, Title, and Description are all strings. But many
@@ -340,7 +359,7 @@ AIM: garry97531
340
359
 
341
360
  == Copyright
342
361
 
343
- Copyright (c) 2005 Garry C. Dolley
362
+ Copyright (c) 2005,2006 Garry C. Dolley
344
363
 
345
364
  eBay4R is free software; you can redistribute it and/or modify it under the
346
365
  terms of the GNU General Public License as published by the Free Software
@@ -356,4 +375,4 @@ You should have received a copy of the GNU General Public License along with
356
375
  eBay4R; if not, write to the Free Software Foundation, Inc., 51 Franklin
357
376
  Street, Fifth Floor, Boston, MA 02110-1301, USA
358
377
 
359
- $Id: README,v 1.14 2005/12/21 02:17:10 garrydolley Exp $
378
+ $Id: README,v 1.16 2006/04/24 05:51:18 garrydolley Exp $
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_and_store_ebay_categories.rb,v 1.2 2006/01/18 09:42:02 garrydolley Exp $
3
+ #
4
+ # == Copyright
5
+ #
6
+ # Copyright (c) 2005,2006 Garry C. Dolley
7
+ #
8
+ # This file is part of eBay4R.
9
+ #
10
+ # eBay4R is free software; you can redistribute it and/or modify it under the
11
+ # terms of the GNU General Public License as published by the Free Software
12
+ # Foundation; either version 2 of the License, or (at your option) any later
13
+ # version.
14
+ #
15
+ # eBay4R is distributed in the hope that it will be useful, but WITHOUT ANY
16
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18
+ # details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License along with
21
+ # eBay4R; if not, write to the Free Software Foundation, Inc., 51 Franklin
22
+ # Street, Fifth Floor, Boston, MA 02110-1301, USA
23
+ #
24
+ # Created : 01/16/2006
25
+ #
26
+ # == Synopsis
27
+ #
28
+ # This script will retrieve the entire eBay Category tree for a specified eBay
29
+ # site (site_id) and store it in a MySQL database.
30
+ #
31
+ # == Database
32
+ #
33
+ # The schema used is as follows:
34
+ #
35
+ # CREATE TABLE ebay_categories (
36
+ # id int(11) NOT NULL auto_increment,
37
+ # site_id smallint(6) default NULL,
38
+ # category_id varchar(10) NOT NULL default '',
39
+ # category_parent_id varchar(10) default NULL,
40
+ # category_name varchar(128) NOT NULL default '',
41
+ # category_level int(11) default NULL,
42
+ # leaf_category tinyint(1) NOT NULL default '0',
43
+ # expired tinyint(1) NOT NULL default '0',
44
+ # virtual tinyint(1) NOT NULL default '0',
45
+ # auto_pay_enabled tinyint(1) NOT NULL default '0',
46
+ # b2b_vat_enabled tinyint(1) NOT NULL default '0',
47
+ # best_offer_enabled tinyint(1) NOT NULL default '0',
48
+ # intl_autos_fixed_cat tinyint(1) NOT NULL default '0',
49
+ # lsd tinyint(1) NOT NULL default '0',
50
+ # orpa tinyint(1) NOT NULL default '0',
51
+ # orra tinyint(1) NOT NULL default '0',
52
+ # PRIMARY KEY (id),
53
+ # UNIQUE KEY site_id (site_id,category_id),
54
+ # KEY category_id (category_id),
55
+ # KEY category_parent_id (category_parent_id),
56
+ # CONSTRAINT ebay_categories_ibfk_1 FOREIGN KEY (category_parent_id)
57
+ # REFERENCES ebay_categories (category_id)
58
+ # ) ENGINE=InnoDB DEFAULT CHARSET=latin1
59
+ #
60
+ # and
61
+ #
62
+ # CREATE TABLE ebay_categories_info (
63
+ # id int(11) NOT NULL auto_increment,
64
+ # site_id smallint(6) default NULL,
65
+ # category_version varchar(16) NOT NULL default '',
66
+ # minimum_reserve_price double default NULL,
67
+ # reduce_reserve_allowed tinyint(1) NOT NULL default '0',
68
+ # reserve_price_allowed tinyint(1) NOT NULL default '0',
69
+ # update_time datetime default NULL,
70
+ # PRIMARY KEY (id)
71
+ # UNIQUE KEY site_id (site_id)
72
+ # ) ENGINE=MyISAM DEFAULT CHARSET=latin1
73
+ #
74
+ # == Usage
75
+ #
76
+ # ./get_and_store_ebay_categories.rb -s site_id [ -t | --table TABLE_BASE_NAME ] [ -h | --host HOST ] [ -d | --database DB ] [ -u | --user USER ] [ -p | --password PW ] [ --debug ] [ -c concurrency ]
77
+ #
78
+ # Example site IDs: 0 = eBay USA, 2 = eBay Canada, 100 = eBay Motors
79
+ #
80
+ # Just like the examples/ directory, you need a file named
81
+ # "myCredentials.rb" in the current directory or Ruby load path.
82
+ #
83
+ # The "-c concurrency" command line option says how many category nodes we
84
+ # retrieve at a time. Default is 20. All direct children are also
85
+ # downloaded (grouped BFS).
86
+ #
87
+ # If you are getting out of memory errors, reduce this number.
88
+ # If you have lots of memory, you can increase this number and the import
89
+ # will be faster.
90
+ #
91
+ # Note: The eBay Category tree is very large. This script can run for 20
92
+ # minutes or longer.
93
+
94
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
95
+
96
+ require 'eBayAPI'
97
+
98
+ require 'optparse'
99
+ require 'rdoc/usage'
100
+
101
+ begin
102
+ require 'rubygems'
103
+ require_gem 'mysql'
104
+ rescue LoadError
105
+ require 'mysql'
106
+ end
107
+
108
+ #
109
+ # Set defaults and parse command line args
110
+ #
111
+
112
+ mysql_hostname = 'localhost'
113
+ mysql_database = 'test'
114
+ mysql_username = 'test'
115
+ mysql_password = ''
116
+
117
+ site_id = 0
118
+ table_name = "ebay_categories"
119
+ concurrency = 20
120
+
121
+ debug = false
122
+
123
+ opts = OptionParser.new
124
+ opts.on("-h", "--help") { RDoc::usage('usage') }
125
+ opts.on("-s SITE_ID") { |sid| site_id = sid }
126
+ opts.on("-c concurrency") { |c| concurrency = c.to_i }
127
+
128
+ opts.on("-h", "--host HOST") { |h| mysql_hostname = h }
129
+ opts.on("-d", "--database DB") { |d| mysql_database = d }
130
+ opts.on("-u", "--user USER") { |u| mysql_username = u }
131
+ opts.on("-p", "--password PW") { |p| mysql_password = p }
132
+ opts.on("--debug") { debug = true }
133
+
134
+ opts.on("-t", "--table TABLE_NAME") { |t| table_name = t }
135
+
136
+ opts.parse(ARGV) rescue RDoc::usage('usage')
137
+
138
+ if ARGV.size < 1
139
+ RDoc::usage('usage')
140
+ exit
141
+ end
142
+
143
+ #
144
+ # Open MySQL database
145
+ #
146
+
147
+ mysql = Mysql.new(mysql_hostname, mysql_username, mysql_password)
148
+ mysql.select_db(mysql_database)
149
+
150
+ # Put your credentials in this file
151
+ load('myCredentials.rb')
152
+
153
+ # Create new eBay caller object. Omit last argument to use live platform.
154
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
155
+ eBay.debug = true if debug
156
+
157
+ parents_to_process = [ :id => '', :depth => 0 ]
158
+
159
+ #
160
+ # Traverse entire category tree and import into our database
161
+ #
162
+
163
+ puts "Starting import... Go get some coffee, this is going to take a while..."
164
+
165
+ imported_site_wide_info = false
166
+ i = 0
167
+ while (some_parents = parents_to_process.first(concurrency)).length > 0
168
+ seek_depth = some_parents.max { |a,b| a[:depth] <=> b[:depth] }
169
+ seek_depth = seek_depth[:depth] + 1
170
+
171
+ if debug
172
+ puts "Current process queue:"
173
+ p parents_to_process
174
+ puts "Up next:"
175
+ p some_parents
176
+ end
177
+
178
+ resp = eBay.GetCategories(:DetailLevel => 'ReturnAll', # Return all available info
179
+ :CategorySideID => site_id,
180
+ :CategoryParent => (some_parents[0][:id] == '' && some_parents.length == 1) ? '' : some_parents.collect { |a| a[:id] },
181
+ :ViewAllNotes => true,
182
+ :LevelLimit => seek_depth)
183
+
184
+ parents_to_process -= some_parents
185
+
186
+ if !imported_site_wide_info
187
+ mysql.query("DELETE FROM #{table_name}_info WHERE site_id = #{site_id}")
188
+
189
+ mysql.query("INSERT INTO #{table_name}_info VALUES (null, '#{site_id}', '#{resp.categoryVersion}', '#{resp.minimumReservePrice}', #{resp.reduceReserveAllowed},
190
+ #{resp.reservePriceAllowed}, '#{resp.updateTime}')")
191
+
192
+ imported_site_wide_info = true
193
+ end
194
+
195
+ if resp.categoryCount.to_i > 0
196
+ [resp.categoryArray.category].flatten.each do |cat|
197
+ if cat.categoryLevel.to_i == seek_depth
198
+ if cat.leafCategory == "false"
199
+ parents_to_process << { :id => cat.categoryID, :depth => cat.categoryLevel.to_i }
200
+ puts "Added Category ##{cat.categoryID} to process queue..." if debug
201
+ end
202
+ end
203
+
204
+ # Make sure we don't try to INSERT a category we already have
205
+ r = mysql.query("SELECT category_id FROM #{table_name} WHERE category_id = #{cat.categoryID} AND site_id = #{site_id}")
206
+
207
+ if r.num_rows < 1
208
+ if cat.categoryID == cat.categoryParentID
209
+ cat.categoryParentID = "null"
210
+ else
211
+ cat.categoryParentID = "'#{cat.categoryParentID}'"
212
+ end
213
+
214
+ cat.categoryName = mysql.escape_string(cat.categoryName)
215
+
216
+ # Determine values of conditional fields
217
+ auto_pay = cat.respond_to?(:autoPayEnabled) ? cat.autoPayEnabled : false
218
+ b2b_vat = cat.respond_to?(:b2BVATEnabled) ? cat.b2BVATEnabled : false
219
+ best_offer = cat.respond_to?(:bestOfferEnabled) ? cat.bestOfferEnabled : false
220
+ orra = cat.respond_to?(:oRRA) ? cat.oRRA : false
221
+ sge = cat.respond_to?(:sellerGuaranteeEligible) ? cat.sellerGuaranteeEligible : false
222
+
223
+ puts "Inserting Category ##{cat.categoryID}: #{cat.categoryName}..." if debug
224
+
225
+ #
226
+ # Do the actual writing to the database
227
+ #
228
+ mysql.query("INSERT INTO #{table_name}
229
+ VALUES (null, '#{site_id}', '#{cat.categoryID}', #{cat.categoryParentID}, '#{cat.categoryName}', '#{cat.categoryLevel}', #{cat.leafCategory},
230
+ #{cat.expired}, #{cat.virtual}, #{auto_pay}, #{b2b_vat}, #{best_offer}, #{cat.intlAutosFixedCat}, #{cat.lSD}, #{cat.oRPA}, #{orra},
231
+ #{sge})")
232
+
233
+ i += 1
234
+ puts "Imported #{i} categories so far..." if i % 100 == 0
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ mysql.close
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # $Id: add_item.rb,v 1.10 2005/12/27 01:17:01 garrydolley Exp $
2
+ # $Id: add_item.rb,v 1.11 2006/01/13 09:56:29 garrydolley Exp $
3
3
 
4
4
  $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
5
  require 'eBayAPI'
@@ -12,17 +12,17 @@ load('myCredentials.rb')
12
12
 
13
13
  eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
14
14
 
15
- # New method of generating complex types, needs some more testing...
16
- resp = eBay.AddItem(:Item => EBay.Item(:PrimaryCategory => EBay.Category(:CategoryID => 57882),
17
- :Title => 'Mouse Pad',
18
- :Description => 'A really cool mouse pad, you know you want it...',
19
- :Location => 'On Earth',
20
- :StartPrice => 12.0,
21
- :Quantity => 1,
22
- :ListingDuration => "Days_7",
23
- :Country => "US",
24
- :Currency => "USD",
25
- :PaymentMethods => ["VisaMC", "PersonalCheck"]))
15
+ # Shorter way of passing complex types (implied by hashing) than when we did in v0.5.2 and prior
16
+ resp = eBay.AddItem(:Item => { :PrimaryCategory => { :CategoryID => 57882 },
17
+ :Title => 'Mouse Pad',
18
+ :Description => 'A really cool mouse pad, you know you want it...',
19
+ :Location => 'On Earth',
20
+ :StartPrice => 12.0,
21
+ :Quantity => 1,
22
+ :ListingDuration => "Days_7",
23
+ :Country => "US",
24
+ :Currency => "USD",
25
+ :PaymentMethods => ["VisaMC", "PersonalCheck"] })
26
26
 
27
27
  puts "New Item #" + resp.itemID + " added."
28
28
  puts "You spent:\n"
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # $Id: get_categories.rb,v 1.1 2005/12/27 01:13:46 garrydolley Exp $
2
+ # $Id: get_categories.rb,v 1.2 2006/01/16 09:52:56 garrydolley Exp $
3
3
 
4
4
  $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
5
 
@@ -17,7 +17,7 @@ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
17
17
 
18
18
  # Call "GetCategories"
19
19
  resp = eBay.GetCategories(:DetailLevel => 'ReturnAll', # Return all available info
20
- :CategorySideID => 1, # US site
20
+ :CategorySideID => 0, # US site
21
21
  :LevelLimit => 1) # Only 1 level deep
22
22
 
23
23
  # Report results
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # $Id: get_categories2.rb,v 1.2 2006/01/07 07:50:27 garrydolley Exp $
2
+ # $Id: get_categories2.rb,v 1.3 2006/01/16 09:54:08 garrydolley Exp $
3
3
 
4
4
  $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
5
 
@@ -17,7 +17,7 @@ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true, :sit
17
17
 
18
18
  # Call "GetCategories"
19
19
  resp = eBay.GetCategories(:DetailLevel => 'ReturnAll', # Return all available info
20
- :CategorySideID => 100, # US eBay Motors Site
20
+ :CategorySideID => 100, # US eBay Motors Site
21
21
  :LevelLimit => 2) # 2 Levels Deep
22
22
 
23
23
  # Report results
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # $Id: get_feedback.rb,v 1.2 2005/12/27 01:17:01 garrydolley Exp $
2
+ # $Id: get_feedback.rb,v 1.3 2006/01/25 08:38:42 garrydolley Exp $
3
3
 
4
4
  $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
5
  require 'eBayAPI'
@@ -45,3 +45,4 @@ puts "Total Feedback:"
45
45
  resp.feedbackSummary.totalFeedbackPeriodArray.feedbackPeriod.each do |fb|
46
46
  puts " Last #{fb.periodInDays} Days: #{fb.count}"
47
47
  end
48
+
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_notification_preferences.rb,v 1.2 2006/03/10 03:52:37 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of GetNotificationPreferences call
9
+ #
10
+
11
+ # Put your credentials in this file
12
+ load('myCredentials.rb')
13
+
14
+ # Create new eBay caller object. Omit last argument to use live platform.
15
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
16
+
17
+ resp = eBay.GetNotificationPreferences(:PreferenceLevel => 'User')
18
+
19
+ if resp.respond_to? 'userDeliveryPreferenceArray'
20
+ [resp.userDeliveryPreferenceArray.notificationEnable].flatten.each do |pref|
21
+ puts "Event Enable: " + pref.eventEnable
22
+ puts "Event Type: " + pref.eventType
23
+ end
24
+ end
25
+
26
+ resp = eBay.GetNotificationPreferences(:PreferenceLevel => 'Application')
27
+
28
+ if resp.respond_to? 'applicationDeliveryPreferences'
29
+ [resp.applicationDeliveryPreferences].flatten.each do |pref|
30
+ puts "Alert Email: " + pref.alertEmail if pref.respond_to? 'alertEmail'
31
+ puts "Alert Enable: " + pref.alertEnable if pref.respond_to? 'alertEnable'
32
+ puts "Application Enable: " + pref.applicationEnable if pref.respond_to? 'applicationEnable'
33
+ puts "Application URL: " + pref.applicationURL if pref.respond_to? 'applicationURL'
34
+ puts "Device Type: " + pref.deviceType if pref.respond_to? 'deviceType'
35
+ puts "Notification Payload: " + pref.notificationPayloadType if pref.respond_to? 'notificationPayloadType'
36
+ end
37
+ end
38
+
39
+ resp = eBay.GetNotificationPreferences(:PreferenceLevel => 'Event')
40
+
41
+ if resp.respond_to? 'eventProperty'
42
+ [resp.eventProperty].flatten.each do |e|
43
+ puts "Event Type: " + e.eventType
44
+ puts "Name: " + e.name
45
+ puts "Value: " + e.value
46
+ end
47
+ end
48
+
49
+ # More fields are present, see eBay's SOAP API Guide
50
+ #
51
+ # If you add on to this example with more fields, please send it to
52
+ # gdolley@ucla.edu so I can include it with the next release :)
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_notifications_usage.rb,v 1.4 2006/03/16 09:37:51 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of GetNotificationsUsage call
9
+ #
10
+
11
+ # Put your credentials in this file
12
+ load('myCredentials.rb')
13
+
14
+ # Create new eBay caller object. Omit last argument to use live platform.
15
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
16
+ eBay.debug = true
17
+
18
+ # Fill this in with a real item number to get more info about notifications
19
+ item_no = ''
20
+
21
+ if !item_no.empty?
22
+ resp = eBay.GetNotificationsUsage(:ItemID => item_no)
23
+
24
+ [resp.notificationDetailsArray.notificationDetails].flatten.each do |notif|
25
+ puts "Delivery Status: " + notif.deliveryStatus
26
+ puts "Delivery Time: " + notif.deliveryTime if notif.respond_to? 'deliveryTime'
27
+ puts "Delivery URL: " + notif.deliveryURL
28
+ puts "Error Message: " + notif.errorMessage
29
+ puts "Expiration Time: " + notif.expirationTime
30
+ puts "Next Retry Time: " + notif.nextRetryTime
31
+ puts "Retries: " + notif.retries if notif.respond_to? 'retries'
32
+ # puts "Type: " + notif.type # Mmmm... "type" is already a method of Object
33
+ end if resp.notificationDetailsArray.respond_to? 'notificationDetails'
34
+ end
35
+
36
+ resp = eBay.GetNotificationsUsage
37
+
38
+ ns = resp.notificationStatistics
39
+
40
+ puts "Current Counters: "
41
+ puts " Delivered: " + ns.deliveredCount
42
+ puts " Errors: " + ns.errorCount
43
+ puts " Expired: " + ns.expiredCount
44
+ puts " Queued New: " + ns.queuedNewCount
45
+ puts " Queued Pending: " + ns.queuedPendingCount
46
+
47
+
48
+
49
+ # More fields are present, see eBay's SOAP API Guide
50
+ #
51
+ # If you add on to this example with more fields, please send it to
52
+ # gdolley@ucla.edu so I can include it with the next release :)