[Pypi-checkins] r1011 - trunk/pypi
richard
python-checkins at python.org
Tue Mar 13 00:10:07 CET 2012
Author: richard
Date: Tue Mar 13 00:10:07 2012
New Revision: 1011
Modified:
trunk/pypi/pkgbase_schema.sql
trunk/pypi/store.py
trunk/pypi/webui.py
Log:
add reading of long description from README files
Modified: trunk/pypi/pkgbase_schema.sql
==============================================================================
--- trunk/pypi/pkgbase_schema.sql (original)
+++ trunk/pypi/pkgbase_schema.sql Tue Mar 13 00:10:07 2012
@@ -119,6 +119,7 @@
summary TEXT,
description TEXT,
description_html TEXT,
+ description_from_readme BOOLEAN,
keywords TEXT,
platform TEXT,
download_url TEXT,
Modified: trunk/pypi/store.py
==============================================================================
--- trunk/pypi/store.py (original)
+++ trunk/pypi/store.py Tue Mar 13 00:10:07 2012
@@ -1,7 +1,7 @@
''' Implements a store of disutils PKG-INFO entries, keyed off name, version.
'''
import sys, os, re, time, hashlib, random, types, math, stat, errno
-import logging, cStringIO, string, datetime, calendar, binascii, urllib2, cgi
+import logging, string, datetime, calendar, binascii, urllib2, cgi
from collections import defaultdict
import cPickle as pickle
try:
@@ -17,6 +17,7 @@
from distutils.version import LooseVersion
import trove, openid2rp
from mini_pkg_resources import safe_name
+from description_utils import processDescription
# csrf modules
import hmac
from base64 import b64encode
@@ -778,6 +779,14 @@
safe_execute(cursor, 'update packages set autohide=%s where name=%s',
[value, name])
+ def set_description(self, name, version, desc_text, desc_html,
+ from_readme=False):
+ cursor = self.get_cursor()
+ safe_execute(cursor, '''update releases set description=%s,
+ description_html=%s, description_from_readme=%s where name=%s
+ and version=%s''', [desc_text, desc_html, from_readme, name,
+ version])
+
def _get_package_url(self, name):
name = name.split()[0]
cursor = self.get_cursor()
@@ -2114,53 +2123,6 @@
except Exception:
pass
-def processDescription(source, output_encoding='unicode'):
- """Given an source string, returns an HTML fragment as a string.
-
- The return value is the contents of the <body> tag.
-
- Parameters:
-
- - `source`: A multi-line text string; required.
- - `output_encoding`: The desired encoding of the output. If a Unicode
- string is desired, use the default value of "unicode" .
- """
- from docutils.core import publish_parts
- from docutils.readers.python.moduleparser import trim_docstring
- # Dedent all lines of `source`.
- source = trim_docstring(source)
-
- settings_overrides={
- 'raw_enabled': 0, # no raw HTML code
- 'file_insertion_enabled': 0, # no file/URL access
- 'halt_level': 2, # at warnings or errors, raise an exception
- 'report_level': 5, # never report problems with the reST code
- }
-
- # capture publishing errors, they go to stderr
- old_stderr = sys.stderr
- sys.stderr = s = cStringIO.StringIO()
- parts = None
- try:
- # Convert reStructuredText to HTML using Docutils.
- parts = publish_parts(source=source, writer_name='html',
- settings_overrides=settings_overrides)
- except:
- pass
-
- sys.stderr = old_stderr
-
- # original text if publishing errors occur
- if parts is None or len(s.getvalue()) > 0:
- output = "".join('<PRE>\n' + cgi.escape(source) + '</PRE>')
- else:
- output = parts['body']
-
- if output_encoding != 'unicode':
- output = output.encode(output_encoding)
-
- return output
-
def xmlescape(url):
'''Make sure a URL is valid XML'''
p = expat.ParserCreate()
Modified: trunk/pypi/webui.py
==============================================================================
--- trunk/pypi/webui.py (original)
+++ trunk/pypi/webui.py Tue Mar 13 00:10:07 2012
@@ -2196,15 +2196,19 @@
"You are not allowed to edit '%s' package information"%name
# verify the release exists
- if not self.store.has_release(name, version):
+ if self.store.has_release(name, version):
+ release_metadata = self.store.get_package(name, version)
+ has_description = release_metadata['description']
+ else:
# auto-register the release...
- data = self.form_metadata()
+ release_metadata = self.form_metadata()
+ has_description = release_metadata.get('description')
try:
- self.validate_metadata(data)
+ self.validate_metadata(release_metadata)
except ValueError, message:
raise FormError, message
- data['_pypi_hidden'] = False
- self.store.store_package(name, version, data)
+ release_metadata['_pypi_hidden'] = False
+ self.store.store_package(name, version, release_metadata)
self.store.changed()
# verify we have enough information
@@ -2286,6 +2290,15 @@
if signature and not signature.startswith("-----BEGIN PGP SIGNATURE-----"):
raise FormError, "signature is not ASCII-armored"
+ # Determine whether we could use a README to fill out a missing
+ # description
+ if not has_description:
+ desc_text, desc_html = extractPackageReadme(content,
+ filename, filetype)
+ if desc_text:
+ self.store.set_description(name, version, desc_text, desc_html,
+ from_readme=True)
+
# digest content
m = hashlib.md5()
m.update(content)
More information about the Pypi-checkins
mailing list