1 """
2 Gchecky provides an abstraction layer between google checkout API and user code.
3
4 It wraps-up the clumsy Level 2 integration API into a human-friendly form.
5
6 All the interaction between Checkout API and user code is handled by
7 the library, which includes the following topics:
8 - generating/validating/parsing XML messages for/from Google Checkout API
9 - transforming the xml DOM trees into a human-friendly structures
10 almost word-by-word following the official specification from google.
11 - does the technical low-level tasks such as generating authentication
12 token from user vendor_id and merchant_key etc.
13 - parses Google Checkout API notification messages and runs
14 the corresponding hook methods.
15
16 Intergration of the library consists of four phases:
17 1. gather your account settings such as your vendor_id, merchant_key,
18 your local currency symbol (ATM either 'USD' or 'GBP')
19 2. create a unique instance of L{gchecky.ControllerLevel_2} class by
20 subclassing it. Provide custom implementation to the abstract methods.
21 Basically all you need is to define your reaction to various API
22 notifications (see step 5 for details).
23 3. set up a separate background thread for sending requests to
24 U{Google Checkout API <http://code.google.com/apis/checkout/developer/index.html#order_processing_api>}.
25 4. set up a web-handler at a publicly accessible url. Refer to the
26 U{Google Checkout Notification API
27 <http://code.google.com/apis/checkout/developer/index.html#handling_notifications>}.
28 But instead of processing incoming XML messages yourself, it should
29 pass the incoming request text to your customized instance of
30 L{gchecky.ControllerLevel_2} (to L{gchecky.ControllerLevel_2.recieve}).
31 5. Provide your local order-processing system integration by overriding
32 abstract methods of your custom instance of L{gchecky.ControllerLevel_2}
33 (see steps 2 and 3).
34 Basically you will need to store Orders in your custom order-processing
35 system, update it state every time you receive a notification from
36 Google Checkout Notification API (notifications correspond to abstract
37 Controller.on_XXX methods). Plus in the step 3 you will need to scan your
38 Order list and perform actions on those orders which are ready for the
39 further processing (charging, refunding, delivering etc.)
40
41 @author: etarassov
42 @version: $Revision $
43 @contact: gchecky at gmail
44 """
45
46 import os.path
47 import re
48
49 VERSION = (0, 2, 1)
50
52 """
53 Return version string.
54 >>> version((0,1,1))
55 '0.1.1'
56 >>> version((0,1,0))
57 '0.1.0'
58 >>> version(VERSION) == version()
59 True
60 """
61 return '.'.join([str(v) for v in version])
62
64 """
65 Return human-friendly version string.
66 >>> human_version((0,1,0))
67 '0.1'
68 >>> human_version(VERSION) == human_version()
69 True
70 """
71
72 human_version = '.'.join([str(v) for v in version[:-1]])
73
74 if version[-1]:
75 rev = None
76
77 import gchecky
78 entries_path = '%s/.svn/entries' % (gchecky.__path__[0])
79 if os.path.exists(entries_path):
80 entries = open(entries_path, 'r').read()
81
82
83 if re.match('(\d+)', entries):
84 rev_match = re.search('\d+\s+dir\s+(\d+)', entries)
85 if rev_match:
86 rev = rev_match.groups()[0]
87
88
89 else:
90 from xml.dom import minidom
91 dom = minidom.parse(entries_path)
92 rev = dom.getElementsByTagName('entry')[0].getAttribute('revision')
93 if not rev:
94 rev = 'unknown'
95 human_version = '%s-%s-SVN%s' % (human_version, version[-1], rev)
96 return human_version
97
98 if __name__ == "__main__":
100 import doctest
101 doctest.testmod()
102 run_doctests()
103