ebay 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,346 @@
1
+
2
+ == Welcome to eBay4R
3
+
4
+ eBay4R is a Ruby wrapper for eBay's Web Services SOAP API (v433). Emphasis is
5
+ on ease of use and small footprint.
6
+
7
+ <b>This code is currently alpha stage</b>.
8
+
9
+ Please report bugs and other problems, see "Author" section at the bottom.
10
+
11
+ Current releases and CVS snapshots can be downloaded from:
12
+
13
+ http://rubyforge.org/projects/ebay4r
14
+
15
+
16
+ == Requirements
17
+
18
+ * SOAP4R library newer than v1.5.5. At the time of this writing, the latest
19
+ version was v1.5.5, which will not work. You have to get a snapshot that is
20
+ dated 11-06-2005 or newer. You can find development snapshots here:
21
+
22
+ http://dev.ctor.org/download
23
+
24
+ So, for example, to download the 11-06-2005 snapshot (the one I personally
25
+ used during development), go here:
26
+
27
+ http://dev.ctor.org/download/archive/soap4r-20051106.tar.gz
28
+
29
+ Note: I _have_ seen one instance of SOAP4R v1.5.5 work out-of-the-box, and
30
+ that was on a Ruby v1.8.3 source install on NetBSD 2.1. On my Debian 3.1
31
+ box, however, I had to install the newer snapshot. Go figure, I don't
32
+ know what the diff is...
33
+
34
+
35
+ == Optionals
36
+
37
+ * RubyGems
38
+
39
+
40
+ == Installation
41
+
42
+ === tar/gzip
43
+
44
+ Just unzip the archive anywhere you like, and see "Getting Started" below
45
+ (you will need to add the ebay4r/lib path to your $RUBYLIB environment
46
+ variable)
47
+
48
+ === RubyGems
49
+
50
+ * To install a gem you already downloaded:
51
+
52
+ gem install ebay-<version>.gem
53
+
54
+ * For the latest release with no fuss (previous download not required):
55
+
56
+ gem install -r ebay4r
57
+
58
+ === CVS
59
+
60
+ You can download the latest and greatest code using anonymous CVS, just type:
61
+
62
+ cvs -d :pserver:anonymous@rubyforge.org:/var/cvs/ebay4r login
63
+ cvs -d :pserver:anonymous@rubyforge.org:/var/cvs/ebay4r checkout ebay4r
64
+
65
+
66
+ == Getting Started
67
+
68
+ If you installed eBay4R from a tarball or CVS, you will want to add the
69
+ ebay4r/lib directory to your Ruby include path ($RUBYLIB). Then put
70
+
71
+ require 'eBayAPI'
72
+
73
+ at the top of your programs.
74
+
75
+ If you installed eBay4R with RubyGems, you don't have to add anything to
76
+ Ruby's include path, just put
77
+
78
+ require 'rubygems'
79
+ require_gem 'ebay'
80
+
81
+ at the top of your programs.
82
+
83
+ === Examples
84
+
85
+ Look at the examples/ directory. Edit the file myCredentials.rb and insert
86
+ the appropriate values. Then you can run any of the example programs.
87
+
88
+ ==== Hello, World!
89
+
90
+ The simplest eBay API call is "GeteBayOfficialTime". Here's how to call it
91
+ with eBay4R:
92
+
93
+ require 'rubygems'
94
+ require_gem 'ebay'
95
+
96
+ # Put your credentials in this file
97
+ load('myCredentials.rb')
98
+
99
+ # Create new eBay caller object. Omit last argument to use live platform.
100
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
101
+
102
+ resp = eBay.GeteBayOfficialTime
103
+
104
+ puts "Hello, World!"
105
+ puts "The eBay time is now: #{resp.timestamp}"
106
+
107
+ # Wasn't that easy?!
108
+
109
+ ==== Adding an Item
110
+
111
+ This is a more complex example that performs a real (useful) function:
112
+
113
+ require 'rubygems'
114
+ require_gem 'ebay'
115
+
116
+ load('myCredentials.rb')
117
+
118
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
119
+
120
+ # New method of generating complex types, needs some more testing...
121
+ resp = eBay.AddItem(:Item => EBay.Item(:PrimaryCategory => EBay.Category(: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
+
135
+ === Format of Requests
136
+
137
+ If <tt>eBay</tt> is your caller object, then you can issue any eBay API call
138
+ by doing:
139
+
140
+ eBay.<call_name>( ... hash of named-arguments ... )
141
+
142
+ For example, to issue the GetItem call for Item ##4503432058 and return all
143
+ information, you do:
144
+
145
+ eBay.GetItem(:DetailLevel => 'ReturnAll', :ItemID => '4503432058')
146
+
147
+ or to see your last invoice using the GetAccount call, you do:
148
+
149
+ eBay.GetAccount(:AccountHistorySelection => 'LastInvoice')
150
+
151
+ See the "eBay Web Services SOAP API Guide" for acceptable parameters and values
152
+ for each API call. This guide can be downloaded at eBay's
153
+ {SOAP Development Center}[http://developer.ebay.com/soap/].
154
+
155
+ ==== Passing Complex Data Types
156
+
157
+ A number of elements in eBay's schema are XML Schema simple types. For
158
+ example, CategoryID, Title, and Description are all strings. But many
159
+ elements, like Item and Seller, are of types "ItemType" and "SellerType",
160
+ respectively. These are complex data types, meaning they are structures
161
+ composed of collections of simple types.
162
+
163
+ "How do I make a complex type object?", you ask. Simple:
164
+
165
+ EBay.<element_name>( ... hash of named-arguments ... )
166
+
167
+ creates a new <em><element_name></em> element of type <em><element_name></em>Type. For
168
+ example,
169
+
170
+ EBay.Item(:Title => 'Mouse Pad', :Description => '...')
171
+
172
+ creates a new ItemType object. Please note, these factory methods are class
173
+ methods of module EBay, so the upper-case "E" in "EBay" is not a typo. A
174
+ more common way to see this is:
175
+
176
+ EBay::Item( ... )
177
+
178
+ The only difference is if you do not pass any arguments to the factory method
179
+ and do not explicitly put empty parentheses (), Ruby will assume it is a
180
+ constant, not a method.
181
+
182
+
183
+ === Format of Responses
184
+
185
+ There is a one-to-one correspondence between the XML returned by eBay and the
186
+ way you access the values contained therein using the response object returned
187
+ by the call. For example, let's say you issued a "GetItem" call:
188
+
189
+ resp = eBay.GetItem(:DetailLevel => 'ReturnAll', :ItemID => '4503432058')
190
+
191
+ and eBay returned the following XML (abbreviated where appropriate):
192
+
193
+ <?xml version="1.0" encoding="UTF-8"?>
194
+ <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
195
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
196
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
197
+ <soapenv:Body>
198
+ <GetItemResponse xmlns="urn:ebay:apis:eBLBaseComponents">
199
+ <Timestamp>2005-12-09T09:40:41.602Z</Timestamp>
200
+ <Ack>Success</Ack>
201
+ <Version>437</Version>
202
+ <Build>e437_core_Bundled_2119808_R1</Build>
203
+ <Item>
204
+ ...
205
+
206
+ <AutoPay>false</AutoPay>
207
+ <BuyerProtection>ItemIneligible</BuyerProtection>
208
+ <BuyItNowPrice currencyID="USD">0.0</BuyItNowPrice>
209
+ <Country>US</Country>
210
+ <Currency>USD</Currency>
211
+ <Description>Fund. of Physics, 5th, by Halliday, Resnick, Walker</Description>
212
+ <Escrow>None</Escrow>
213
+ <GiftIcon>0</GiftIcon>
214
+ ...
215
+
216
+ <ShipToLocations>US</ShipToLocations>
217
+ <ShipToLocations>CA</ShipToLocations>
218
+ </Item>
219
+ </GetItemResponse>
220
+ </soapenv:Body>
221
+ </soapenv:Envelope>
222
+
223
+
224
+ The "resp" object is of type
225
+
226
+ SOAP::Mapping::Object
227
+
228
+ and contains all the XML elements between <tt><GetItemResponse> ... </GetItemResponse></tt>.
229
+
230
+ So, if you want to print the item description, just do:
231
+
232
+ puts resp.item.description
233
+
234
+ and you will see:
235
+
236
+ "Fund. of Physics, 5th, by Halliday, Resnick, Walker"
237
+
238
+ Repeated XML elements automatically become arrays of the same name, so to see
239
+ all the locations this item can ship to, just do:
240
+
241
+ resp.item.shipToLocations.each { |loc| puts loc }
242
+
243
+ and you will see:
244
+
245
+ US
246
+ CA
247
+
248
+ It's that easy! (Are any Java or C# developers reading this? Don't be
249
+ jealous... ;)
250
+
251
+ === A Note about Case
252
+
253
+ Astute readers (all of you, right?) will notice that the first letter of every
254
+ element contained within the response object is lower-case, even though in the
255
+ XML it is upper-case. This is currently the way things are and you will have
256
+ to remember to lower the first character in your code.
257
+
258
+ Ruby's convention is that only classes, modules, and constants begin with
259
+ upper-case letters. The author of the SOAP4R library (which contains
260
+ wsdl2ruby.rb) respected this convention, and as a result, the eBay.rb
261
+ file I use (generated from eBay's WSDL) has this mapping.
262
+
263
+ I haven't come up with any Ruby magic to dynamically allow upper-case first
264
+ characters to work also, so if you happen to want to take a crack at it and
265
+ get it working, please send me your patches (see "Author" section at the
266
+ bottom).
267
+
268
+ Please note, the opposite does _not_ apply. That is, you can *submit* a call
269
+ using either case of the first character, and your arguments can also have
270
+ either case letter first. For example, this:
271
+
272
+ resp = eBay.GetItem(:DetailLevel => 'ReturnAll', :ItemID => '4503432058')
273
+
274
+ is the same as:
275
+
276
+ resp = eBay.getItem(:detailLevel => 'ReturnAll', :itemID => '4503432058')
277
+
278
+
279
+ == Debugging
280
+
281
+ If "eBay" is your eBay caller object, as in:
282
+
283
+ eBay = EBay::API.new( ... )
284
+
285
+ You can see XML wiredumps by doing:
286
+
287
+ eBay.debug = true
288
+
289
+ before you issue any eBay API calls. This is useful to see the raw XML of
290
+ what eBay is sending back to you.
291
+
292
+
293
+ == Files
294
+
295
+ examples/
296
+ Examples of eBay API calls using this library. You will want to check out
297
+ these examples before making your own calls.
298
+
299
+ lib/eBayAPI.rb
300
+ The heart of this library
301
+
302
+ lib/eBayDriver.rb
303
+ Autogenerated by wsdl2ruby.rb
304
+
305
+ lib/eBay.rb
306
+ Autogenerated by wsdl2ruby.rb
307
+
308
+ lib/RequesterCredentialsHandler.rb
309
+ Helper for generating the eBay Authentication header for each call
310
+
311
+ test/
312
+ Unit and functional tests
313
+
314
+
315
+ == To Do
316
+
317
+ * Add many more examples
318
+ * Add more unit and functional tests
319
+
320
+
321
+ == Author
322
+
323
+ Garry C. Dolley
324
+
325
+ gdolley [at] ucla.edu
326
+
327
+ AIM: garry97531
328
+
329
+
330
+ == Copyright
331
+
332
+ Copyright (c) 2005 Garry C. Dolley
333
+
334
+ eBay4R is free software; you can redistribute it and/or modify it under the
335
+ terms of the GNU General Public License as published by the Free Software
336
+ Foundation; either version 2 of the License, or (at your option) any later
337
+ version.
338
+
339
+ eBay4R is distributed in the hope that it will be useful, but WITHOUT ANY
340
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
341
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
342
+ details.
343
+
344
+ You should have received a copy of the GNU General Public License along with
345
+ eBay4R; if not, write to the Free Software Foundation, Inc., 51 Franklin
346
+ Street, Fifth Floor, Boston, MA 02110-1301, USA
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
+ require 'eBayAPI'
5
+
6
+ #
7
+ # Example of AddItem call
8
+ #
9
+
10
+ load('myCredentials.rb')
11
+
12
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
13
+
14
+ # New method of generating complex types, needs some more testing...
15
+ resp = eBay.AddItem(:Item => EBay.Item(:PrimaryCategory => EBay.Category(:CategoryID => 57882),
16
+ :Title => 'Mouse Pad',
17
+ :Description => 'A really cool mouse pad, you know you want it...',
18
+ :Location => 'On Earth',
19
+ :StartPrice => 12.0,
20
+ :Quantity => 1,
21
+ :ListingDuration => "Days_7",
22
+ :Country => "US",
23
+ :Currency => "USD",
24
+ :PaymentMethods => ["VisaMC", "PersonalCheck"]))
25
+
26
+ puts "New Item #" + resp.itemID + " added."
27
+ puts "You spent:\n"
28
+
29
+
30
+ # The fees part of the response looks like this:
31
+ #
32
+ # <Fees>
33
+ # <Fee>
34
+ # <Name>AuctionLengthFee</Name>
35
+ # <Fee currencyID="USD">0.0</Fee>
36
+ # </Fee>
37
+ # <Fee>
38
+ # <Name>BoldFee</Name>
39
+ # <Fee currencyID="USD">0.0</Fee>
40
+ # </Fee>
41
+ # ...
42
+ # <Fee>
43
+ # <Name>InsertionFee</Name>
44
+ # <Fee currencyID="USD">0.6</Fee>
45
+ # </Fee>
46
+ # ...
47
+ # </Fees>
48
+ #
49
+ # So this is now we traverse it:
50
+ resp.fees.fee.each do |fee|
51
+ puts fee.name + ": " + fee.fee + " " + fee.fee.xmlattr_currencyID
52
+ end
53
+
54
+ # Notice how the object names reflect the XML element names, and any element
55
+ # that is repeated automatically becomes an array, so you can run "each" on
56
+ # it.
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
+ require 'eBayAPI'
5
+
6
+ #
7
+ # Example of GetAccount call requesting the last monthly statement
8
+ #
9
+
10
+ load('myCredentials.rb')
11
+
12
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
13
+
14
+ resp = eBay.GetAccount(:AccountHistorySelection => 'LastInvoice')
15
+
16
+ puts "AccountID: " + resp.accountID
17
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState
18
+
19
+ # Not all statements will have an <AccountState>, so we only print it if present
20
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState if resp.accountSummary.respond_to?(:accountState)
21
+
22
+ # Some statements may not have any entries in them (no sales that month?), so
23
+ # we must test to make sure "accountEntries" exists before we traverse it.
24
+ if resp.respond_to?(:accountEntries)
25
+ resp.accountEntries.accountEntry.each do |entry|
26
+ puts "Account Entries -- Description: " + entry.description
27
+ end
28
+ end
29
+
30
+ # Many more fields may be present, see eBay's SOAP API Guide or GetAccountResponseType class in "../lib/eBay.rb"
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
+ require 'eBayAPI'
5
+
6
+ #
7
+ # Example of GetAccount call requesting a specific monthly statement
8
+ #
9
+
10
+ load('myCredentials.rb')
11
+
12
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
13
+
14
+ resp = eBay.GetAccount(:AccountHistorySelection => 'SpecifiedInvoice', :InvoiceDate => '2005-11-01')
15
+
16
+ puts "AccountID: " + resp.accountID
17
+ puts "Account Summary -- Invoice Balance: " + resp.accountSummary.invoiceBalance
18
+
19
+ # Not all statements will have an <AccountState>, so we only print it if present
20
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState if resp.accountSummary.respond_to?(:accountState)
21
+
22
+ # Some statements may not have any entries in them (no sales that month?), so
23
+ # we must test to make sure "accountEntries" exists before we traverse it.
24
+ if resp.respond_to?(:accountEntries)
25
+ resp.accountEntries.accountEntry.each do |entry|
26
+ puts "Account Entries -- Description: " + entry.description
27
+ end
28
+ end
29
+
30
+ # Many more fields may be present, see eBay's SOAP API Guide or GetAccountResponseType class in "../lib/eBay.rb"