[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