janto / scikits_index (http://scikits.appspot.com/)
Google app code for scikits.appspot.com
Clone this repository (size: 465.7 KB): HTTPS / SSH
$ hg clone http://bitbucket.org/janto/scikits_index/
| commit 22: | ac808b8d75f2 |
| parent 21: | 37babc6bd4ed |
| branch: | default |
scan scikits.learn repo as well \nrss feed now linked
15 months ago
Changed (Δ232 bytes):
raw changeset »
code/scikits.py (47 lines added, 48 lines removed)
code/templates.py (1 lines added, 0 lines removed)
code/tools.py (0 lines added, 1 lines removed)
Up to file-list code/scikits.py:
| … | … | @@ -68,7 +68,6 @@ class Page(webapp.RequestHandler): |
68 |
68 |
newest_packages_html += "<!-- forced fetch of url : %s -->\n" % url |
69 |
69 |
get_url(url, force_fetch=True, cache_duration=PACKAGE_NEWS_CACHE_DURATION) |
70 |
70 |
|
71 |
||
72 |
71 |
# admin sidebar |
73 |
72 |
admin_sidebar_html = "" |
74 |
73 |
if users.is_current_user_admin(): |
| … | … | @@ -249,18 +248,25 @@ class Package(object): |
249 |
248 |
|
250 |
249 |
from_repo = 1 |
251 |
250 |
if from_repo: |
252 |
logger.info("loading packages from repo") |
|
253 |
for repo_url in fetch_dir_links(REPO_PATH): |
|
254 |
|
|
251 |
for repo_base_url in [ |
|
252 |
"http://svn.scipy.org/svn/scikits/trunk", |
|
253 |
"http://svn.scipy.org/svn/scikits/trunk/learn/scikits/learn/machine/", |
|
254 |
]: |
|
255 |
logger.info("loading packages from repo %s" % repo_base_url) |
|
256 |
for repo_url in fetch_dir_links(repo_base_url): |
|
257 |
package_name = "scikits.%s" % os.path.split(repo_url)[1] |
|
258 |
if package_name in packages: |
|
259 |
continue |
|
255 |
260 |
|
256 |
# check if really a package |
|
257 |
#~ url = os.path.join(repo_url, "setup.py") |
|
258 |
#~ result = get_url(url) |
|
259 |
#~ if result.status_code != 200: # setup.py was not found |
|
260 |
#~ continue |
|
261 |
261 |
|
262 |
package = Package(name=package_name, repo_url=repo_url) |
|
263 |
packages[package.name] = package |
|
262 |
# check if really a package |
|
263 |
#~ url = os.path.join(repo_url, "setup.py") |
|
264 |
#~ result = get_url(url) |
|
265 |
#~ if result.status_code != 200: # setup.py was not found |
|
266 |
#~ continue |
|
267 |
||
268 |
package = Package(name=package_name, repo_url=repo_url) |
|
269 |
packages[package.name] = package |
|
264 |
270 |
|
265 |
271 |
from_pypi_search = 1 |
266 |
272 |
if from_pypi_search: |
| … | … | @@ -284,11 +290,27 @@ class Package(object): |
284 |
290 |
def __cmp__(self, other): |
285 |
291 |
return cmp(self.name, other.name) |
286 |
292 |
|
293 |
def python_versions(self): |
|
294 |
#XXX xmlrpc call truncated? |
|
295 |
return |
|
296 |
||
297 |
server = xmlrpclib.ServerProxy('http://pypi.python.org/pypi', transport=GoogleXMLRPCTransport()) |
|
298 |
release_versions = server.package_releases(self.name) |
|
299 |
python_versions = [] |
|
300 |
for release_version in sorted(release_versions, reverse=True): |
|
301 |
for d in server.release_urls(self.name, release_version): |
|
302 |
release_versions.append(d["python_version"]) |
|
303 |
break #XXX only the biggest listed version number? |
|
304 |
return python_versions |
|
305 |
||
287 |
306 |
def download_links_html(self): |
307 |
#XXX xmlrpc call truncated? |
|
308 |
return |
|
309 |
||
288 |
310 |
text = [] |
289 |
311 |
server = xmlrpclib.ServerProxy('http://pypi.python.org/pypi', transport=GoogleXMLRPCTransport()) |
290 |
312 |
versions = server.package_releases(self.name) |
291 |
for version in |
|
313 |
for version in sorted(versions, reverse=True): |
|
292 |
314 |
text.append("<table>") |
293 |
315 |
text.append("""<tr> |
294 |
316 |
<th>Python version</th> |
| … | … | @@ -305,7 +327,7 @@ class Package(object): |
305 |
327 |
text.append("</tr>") |
306 |
328 |
text.append("</table>") |
307 |
329 |
|
308 |
break # |
|
330 |
break #XXX only the biggest listed version number? |
|
309 |
331 |
return "\n".join(text) |
310 |
332 |
|
311 |
333 |
def info(self, force_fetch=False): |
| … | … | @@ -377,7 +399,6 @@ class Package(object): |
377 |
399 |
#~ logger.debug(parts) |
378 |
400 |
#~ escaped_description = parts["fragment"] |
379 |
401 |
|
380 |
#~ if "WARNING" in escaped_description: |
|
381 |
402 |
escaped_description = htmlquote(d["description"]).replace(r"\n", "<br />\n") |
382 |
403 |
|
383 |
404 |
revision = d.get("revision") |
| … | … | @@ -605,6 +626,12 @@ class AdminPage(Page): |
605 |
626 |
self.write('<a href="%s">sign out</a>.' % users.create_logout_url("/admin")) |
606 |
627 |
self.write("</p>") |
607 |
628 |
|
629 |
self.write(""" |
|
630 |
||
631 |
<a href="http://feedvalidator.org.li.sabren.com/check.cgi?url=http%3A//scikits.appspot.com/rss.xml">validate rss</a> |
|
632 |
||
633 |
""") |
|
634 |
||
608 |
635 |
# memcache management |
609 |
636 |
self.write("<h2>memcache</h2>") |
610 |
637 |
if self.request.get("clear_memcache"): |
| … | … | @@ -647,38 +674,10 @@ class DebugPage(Page): |
647 |
674 |
self.print_header() |
648 |
675 |
self.print_menu() |
649 |
676 |
|
650 |
#~ http://wiki.python.org/moin/PyPiXmlRpc |
|
651 |
server = xmlrpclib.ServerProxy('http://pypi.python.org/pypi', transport=GoogleXMLRPCTransport()) |
|
652 |
677 |
|
653 |
self.write("scikits:<br />\n") |
|
654 |
results = server.search(dict(name="scikits")) |
|
655 |
package_names = sorted(set(result["name"] for result in results)) # unique names, pypi contains duplicate names |
|
656 |
self.write(package_names) |
|
657 |
self.write("<br />\n") |
|
658 |
||
659 |
#~ for result in results: |
|
660 |
#~ self.write(result) |
|
661 |
#~ self.write("<br />\n") |
|
662 |
||
663 |
package_name = 'scikits.ann' |
|
664 |
versions = server.package_releases(package_name) |
|
665 |
self.write(versions) |
|
666 |
self.write("<br />\n") |
|
667 |
||
668 |
for version in versions: |
|
669 |
d = server.release_data(package_name, version) |
|
670 |
self.write(d) |
|
671 |
self.write("<br />\n") |
|
672 |
||
673 |
for d in server.release_urls(package_name, version): |
|
674 |
self.write(d) |
|
675 |
self.write("<br />\n") |
|
676 |
||
677 |
break # only latest |
|
678 |
||
679 |
self.write("download:") |
|
680 |
678 |
for p in Package.packages().values(): |
681 |
self.write( |
|
679 |
self.write("<h4>%s</h4>\n" % p.name) |
|
680 |
self.write(p.python_versions()) |
|
682 |
681 |
|
683 |
682 |
self.print_footer() |
684 |
683 |
|
| … | … | @@ -698,18 +697,18 @@ class RSSFeedPage(Page): |
698 |
697 |
title = name, |
699 |
698 |
link = "http://scikits.appspot.com/%s" % short_name, |
700 |
699 |
description = 'Released file: <a href="%(url)s">%(url)s</a>' % locals(), |
701 |
guid = PyRSS2Gen.Guid("http://scikits.appspot.com/%(short_name)s?feed_ |
|
700 |
guid = PyRSS2Gen.Guid("http://scikits.appspot.com/%(short_name)s?feed_release=%(name)s" % locals()), |
|
702 |
701 |
pubDate = t) |
703 |
702 |
items.append(rss_item) |
704 |
703 |
|
705 |
704 |
rss = PyRSS2Gen.RSS2( |
706 |
705 |
title = "SciKits", |
707 |
706 |
link = "http://scikits.appspot.com/", |
708 |
description = " |
|
707 |
description = "SciKits released via PyPI", |
|
709 |
708 |
lastBuildDate = datetime.datetime.now(), |
710 |
709 |
items = items) |
711 |
710 |
|
712 |
self.write(rss.to_xml( |
|
711 |
self.write(rss.to_xml("utf-8")) |
|
713 |
712 |
|
714 |
713 |
application = webapp.WSGIApplication([ |
715 |
714 |
('/', MainPage), |
| … | … | @@ -726,7 +725,7 @@ application = webapp.WSGIApplication([ |
726 |
725 |
('/debug', DebugPage), |
727 |
726 |
('/edit', EditPage), |
728 |
727 |
('/robots.txt', RobotsPage), |
729 |
('/ |
|
728 |
('/rss.xml', RSSFeedPage), |
|
730 |
729 |
|
731 |
730 |
('/(.+)', PackageInfoPage), |
732 |
731 |
], debug=True) |
Up to file-list code/templates.py:
| … | … | @@ -8,6 +8,7 @@ header_template = """ |
8 |
8 |
|
9 |
9 |
<link href="/static/sphinxdoc.css" rel="stylesheet" type="text/css" /> |
10 |
10 |
<link href="/static/images/download_32.png" rel="icon" type="image/png" /> |
11 |
<link href="/rss.xml" rel="alternate" type="application/rss+xml" title="SciKits Releases" /> |
|
11 |
12 |
|
12 |
13 |
</head> |
13 |
14 |
Up to file-list code/tools.py:
| … | … | @@ -21,7 +21,6 @@ import PyRSS2Gen |
21 |
21 |
# set up locations |
22 |
22 |
ROOT = os.path.dirname(__file__) |
23 |
23 |
ON_DEV_SERVER = os.environ.get("SERVER_SOFTWARE", "dev").lower().startswith("dev") |
24 |
REPO_PATH = "http://svn.scipy.org/svn/scikits/trunk" |
|
25 |
24 |
|
26 |
25 |
SECONDS_IN_MINUTE = 60 |
27 |
26 |
SECONDS_IN_HOUR = SECONDS_IN_MINUTE * 60 |
