Mercurial > hg > smartopen
annotate smartopen/handlers.py @ 15:1281d999618c
yep
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 01 May 2013 08:06:50 -0700 |
parents | a62fbff067f8 |
children |
rev | line source |
---|---|
15 | 1 """ |
2 handlers for smartopen | |
3 """ | |
4 | |
0 | 5 import address |
10
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
6 import string |
15 | 7 import subprocess |
0 | 8 import urllib |
9 import urllib2 | |
10 | |
11 | 11 class Location(object): |
0 | 12 """ |
13 generic class for locations | |
14 """ | |
15 | |
16 def __init__(self, baseurl=""): | |
17 self.baseurl = baseurl | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
18 # should/could strip here? |
0 | 19 |
20 def url(self, query): | |
15 | 21 """the URL to construct""" |
0 | 22 return self.baseurl + self.process(query) |
23 | |
24 def process(self, query): | |
15 | 25 """how to process the query""" |
26 return query.strip() | |
0 | 27 |
28 def test(self, query): | |
15 | 29 """whether the handler matches""" |
0 | 30 return True |
31 | |
11 | 32 def exists(self, URL): |
33 """does a URL exist?""" | |
12
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
34 # need a phony user agent so wikipedia won't know we're a bot |
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
35 headers = {} |
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
36 headers['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4' |
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
37 |
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
38 request = urllib2.Request(URL, None, headers) |
11 | 39 try: |
12
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
40 f = urllib2.urlopen(request).read() |
11 | 41 return True |
12
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
42 except urllib2.HTTPError, e: |
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
43 return False |
bb995bdf82e2
annoyingly work around user agents again; i hate robot protection sometimes
Jeff Hammel <jhammel@mozilla.com>
parents:
11
diff
changeset
|
44 except urllib2.URLError, e: |
11 | 45 return False |
0 | 46 |
47 class URL(Location): | |
48 """a straight URL""" | |
49 | |
50 def process(self, query): | |
51 if '://' in query: | |
52 return query | |
53 return 'http://' + query | |
54 | |
55 def test(self, query): | |
56 """try to open the url""" | |
57 if ' ' in query or '\n' in query: | |
58 return False | |
11 | 59 return self.exists(self.process(query)) |
0 | 60 |
1 | 61 class GoogleMaps(Location): |
0 | 62 """try to google-maps the address""" |
63 | |
64 def __init__(self): | |
65 gmapsurl='http://maps.google.com/maps?f=q&hl=en&q=' | |
66 Location.__init__(self, gmapsurl) | |
67 | |
68 def process(self, query): | |
69 theaddress = address.normalizeaddress(query) | |
70 if not theaddress: | |
71 return theaddress | |
72 return urllib.quote_plus(theaddress) | |
73 | |
74 def test(self, query): | |
75 return bool(self.process(query)) | |
76 | |
1 | 77 class Trac(Location): |
2 | 78 def __init__(self, baseurl): |
79 baseurl = baseurl.strip('/') + '/' | |
80 Location.__init__(self, baseurl) | |
0 | 81 |
2 | 82 def process(self, query): |
83 if query[0] == 'r': | |
84 if query[1:].isdigit(): | |
85 return 'changeset/' + str(query[1:]) | |
86 if query[0] == '#': | |
87 if query[1:].isdigit(): | |
88 return 'ticket/' + str(query[1:]) | |
0 | 89 |
2 | 90 def test(self, query): |
91 return bool(self.process(query)) | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
92 |
0 | 93 |
94 class Wikipedia(Location): | |
95 """try to open the query in wikipedia""" | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
96 def __init__(self): |
0 | 97 wikiurl = 'http://en.wikipedia.org/wiki/' |
98 Location.__init__(self, wikiurl) | |
99 | |
100 def process(self, query): | |
101 return urllib.quote_plus('_'.join(query.split())) | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
102 |
0 | 103 def test(self, query): |
104 'test to see if the article exists' | |
105 | |
106 # need a phony user agent so wikipedia won't know we're a bot | |
107 headers = {} | |
108 headers['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4' | |
109 | |
110 request = urllib2.Request(self.url(query), None, headers) | |
111 try: | |
112 f = urllib2.urlopen(request).read() | |
113 except urllib2.HTTPError, e: | |
114 return False | |
115 | |
116 if 'Wikipedia does not have an article with this exact name' in f: | |
117 return False | |
118 return True | |
119 | |
11 | 120 class Wiktionary(Location): |
121 def __init__(self): | |
122 baseurl = 'http://en.wiktionary.org/wiki/' | |
123 Location.__init__(self, baseurl) | |
124 def test(self, query): | |
125 for c in (' ', '\n', '/'): | |
126 if c in query: | |
127 return False | |
128 if self.exists(self.url(query)): | |
129 return True | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
130 |
7 | 131 class Bugzilla(Location): |
132 def __init__(self): | |
133 baseurl = 'https://bugzilla.mozilla.org/show_bug.cgi?id=' | |
134 Location.__init__(self, baseurl) | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
135 |
7 | 136 def test(self, query): |
137 try: | |
138 int(query) | |
139 return True | |
140 except: | |
141 return False | |
142 | |
0 | 143 class Google(Location): |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
144 def __init__(self): |
0 | 145 googleurl = 'http://www.google.com/search?hl=en&q=' |
146 Location.__init__(self, googleurl) | |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
147 |
0 | 148 def process(self, query): |
149 return urllib.quote_plus(query) | |
7 | 150 |
8
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
151 class FedEx(Location): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
152 def __init__(self): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
153 baseurl = 'http://www.fedex.com/Tracking?cntry_code=us&language=english&tracknumber_list=' |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
154 Location.__init__(self, baseurl) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
155 |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
156 def process(self, query): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
157 if query.count(' ') == 2: |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
158 query = ''.join(query.split(' ')) |
8
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
159 return query |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
160 |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
161 def test(self, query): |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
162 query = self.process(query) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
163 if len(query) != 12: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
164 return False |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
165 try: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
166 int(query) |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
167 except ValueError: |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
168 return False |
44950f376e98
add FedEx tracking number handler
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
169 return True |
10
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
170 |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
171 class MercurialRevision(Location): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
172 def __init__(self): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
173 baseurl = 'http://hg.mozilla.org/mozilla-central/rev/' |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
174 Location.__init__(self, baseurl) |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
175 |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
176 def test(self, query): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
177 query = set(query) |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
178 if query.issubset(string.digits + 'abcdef'): |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
179 return True |
a963acb1713d
add a new handler: MercurialRevision
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
180 return False |
13 | 181 |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
182 class UbuntuPackage(Location): |
15 | 183 # Note: only works where apt-cache is available |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
184 def __init__(self): |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
185 baseurl = 'http://packages.ubuntu.com/' |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
186 Location.__init__(self, baseurl) |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
187 |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
188 def test(self, query): |
15 | 189 if len(query.strip().split()) > 1: |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
190 return False # no spaces in packages |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
191 |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
192 # use `apt-cache show` for the package name |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
193 # the output could be captured:, e.g. |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
194 # ... |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
195 # Filename: pool/main/h/hello/hello_2.8-2_amd64.deb |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
196 # Size: 28124 |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
197 # MD5sum: 73ad59a7920e2adcff9b84c00e38418a |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
198 # SHA1: 70ef927cfa40b8e367f9ca7821e0064a946726c5 |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
199 # SHA256: f8341711f6b803e032be9aff2206dfdb4045a0c6c296b0ea0d310d415f10ff4d |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
200 # Description-en: The classic greeting, and a good example |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
201 # The GNU hello program produces a familiar, friendly greeting. It |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
202 # allows non-programmers to use a classic computer science tool which |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
203 # would otherwise be unavailable to them. |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
204 # . |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
205 # Seriously, though: this is an example of how to do a Debian package. |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
206 # It is the Debian version of the GNU Project's `hello world' program |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
207 # (which is itself an example for the GNU Project). |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
208 # Homepage: http://www.gnu.org/software/hello/ |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
209 # Description-md5: b7df6fe7ffb325083a3a60819a7df548 |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
210 # Bugs: https://bugs.launchpad.net/ubuntu/+filebug |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
211 # Origin: Ubuntu |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
212 # Supported: 18m |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
213 |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
214 # in theory both the home page and the ubuntu page could be interesting |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
215 # (different handlers?) |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
216 |
15 | 217 returncode = subprocess.call(['apt-cache', 'show', query], stdout=subprocess.PIPE) |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
218 if returncode: |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
219 return False |
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
220 |
15 | 221 return True |
222 | |
13 | 223 # TODO: |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
224 # - https://mozillians.org/en-US/u/jhammel/ handler |
13 | 225 # - https://mozillians.org/en-US/u/williamr/ handler |
14
a62fbff067f8
start bringing this whole thing up to speed
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
226 # ... but no 404??? |