commit 22: ac808b8d75f2
parent 21: 37babc6bd4ed
branch: default
scan scikits.learn repo as well \nrss feed now linked
jantod
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
					package_name = "scikits.%s" % os.path.split(repo_url)[1]
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 versions:
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 # only the first listed version?
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(p.download_links_html())
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_update=%(name)s" % locals()),
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 = "Updates to SciKits release files",
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
	('/feed', RSSFeedPage),
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