$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78677 - in website/public_html/beta/site-tools: . boost_site
From: dnljms_at_[hidden]
Date: 2012-05-27 08:48:45
Author: danieljames
Date: 2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
New Revision: 78677
URL: http://svn.boost.org/trac/boost/changeset/78677
Log:
Website: Try to support python 3.
This is pretty messy, seems to work okay.
Text files modified: 
   website/public_html/beta/site-tools/boost_site/boostbook_parser.py |     4 +-                                      
   website/public_html/beta/site-tools/boost_site/pages.py            |    25 ++++++++++--------                      
   website/public_html/beta/site-tools/boost_site/site_tools.py       |    14 +++++++--                               
   website/public_html/beta/site-tools/boost_site/state.py            |    55 ++++++++++++++++++++++++----------------
   website/public_html/beta/site-tools/boost_site/upgrade.py          |     4 +-                                      
   website/public_html/beta/site-tools/boost_site/util.py             |    31 ++++++++++++++++------                  
   website/public_html/beta/site-tools/release.py                     |    10 +++---                                  
   7 files changed, 88 insertions(+), 55 deletions(-)
Modified: website/public_html/beta/site-tools/boost_site/boostbook_parser.py
==============================================================================
--- website/public_html/beta/site-tools/boost_site/boostbook_parser.py	(original)
+++ website/public_html/beta/site-tools/boost_site/boostbook_parser.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -19,7 +19,7 @@
 
         article_node = article.documentElement
         if article_node.nodeName != 'article':
-            print "Boostbook file not article:", filename
+            print("Boostbook file not article:", filename)
             return
 
         id = ''
@@ -207,7 +207,7 @@
     
     def new_node( self, tag, *child, **kwargs ):
         result = self.document.createElement(tag)
-        for k in kwargs.keys():
+        for k in list(kwargs.keys()):
             if kwargs[k] != '':
                 if k == 'id':
                     result.setAttribute('id',kwargs[k])
Modified: website/public_html/beta/site-tools/boost_site/pages.py
==============================================================================
--- website/public_html/beta/site-tools/boost_site/pages.py	(original)
+++ website/public_html/beta/site-tools/boost_site/pages.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -4,7 +4,7 @@
 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
 import boost_site.state, boost_site.util
-import os, hashlib, xml.dom.minidom, re, fnmatch, subprocess, tempfile, time
+import os, sys, hashlib, xml.dom.minidom, re, fnmatch, subprocess, tempfile, time
 
 class Pages:
     """ Tracks which items in an rss feed have been updated.
@@ -36,10 +36,13 @@
         boost_site.state.save(save_hashes, self.hash_file)
 
     def add_qbk_file(self, qbk_file, location, page_data):
-        file = open(qbk_file)
-        try:
+        if sys.version_info < (3,0):
+            file = open(qbk_file, 'r')
             qbk_hash = hashlib.sha256(file.read()).hexdigest()
-        finally:
+            file.close()
+        else:
+            file = open(qbk_file, 'rb')
+            qbk_hash = hashlib.sha256(file.read().replace(bytes([13,10]), bytes([10]))).hexdigest()
             file.close()
 
         record = None
@@ -83,8 +86,8 @@
                         'last_modified': self.pages[self.rss_hashes[hashed]].last_modified
                     }
                 else:
-                    print "Unable to find quickbook file for rss item:"
-                    print hashed
+                    print("Unable to find quickbook file for rss item:")
+                    print(hashed)
 
         return rss_items
 
@@ -95,7 +98,7 @@
         try:
             subprocess.check_call(['quickbook', '--version'])
         except:
-            print "Problem running quickbook, will not convert quickbook articles."
+            print("Problem running quickbook, will not convert quickbook articles.")
             return
         
         bb_parser = boost_site.boostbook_parser.BoostBookParser()
@@ -107,7 +110,7 @@
                 os.close(xml_file[0])
                 xml_filename = xml_file[1]
                 try:
-                    print "Converting " + page + ":"
+                    print("Converting " + page + ":")
                     subprocess.check_call(['quickbook', '--output-file', xml_filename, '-I', 'feed', page])
                     page_data.load(bb_parser.parse(xml_filename), refresh)
                 finally:
@@ -158,7 +161,7 @@
         for pattern in patterns:
             pattern_parts = pattern.split('|')
             matches = [x for x in
-                fnmatch.filter(self.pages.keys(), pattern_parts[0])
+                fnmatch.filter(list(self.pages.keys()), pattern_parts[0])
                 if self.pages[x].is_published(pattern_parts[1:])]
             filtered = filtered | set(matches)
 
@@ -209,7 +212,7 @@
                 self.release_status = 'dev'
             status_parts = self.release_status.split(' ', 2)
             if status_parts[0] not in ['released', 'beta', 'dev']:
-                print "Error: Unknown release status: " + self.release_status
+                print("Error: Unknown release status: " + self.release_status)
                 self.release_status = None
             if self.release_status:
                 self.flags.add(status_parts[0])
@@ -361,7 +364,7 @@
 
 def number_suffix(x):
     x = x % 100
-    if x / 10 == 1:
+    if x // 10 == 1:
         return "th"
     else:
         return ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"][x % 10]
Modified: website/public_html/beta/site-tools/boost_site/site_tools.py
==============================================================================
--- website/public_html/beta/site-tools/boost_site/site_tools.py	(original)
+++ website/public_html/beta/site-tools/boost_site/site_tools.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -86,9 +86,9 @@
                         rss_feed.importNode(
                             old_rss_items[qbk_page.qbk_file]['item'], True))
                 else:
-                    print "Missing entry for %s" % qbk_page.qbk_file
+                    print("Missing entry for %s" % qbk_page.qbk_file)
                     
-            output_file = open(feed_file, 'w')
+            output_file = open(feed_file, 'wb')
             try:
                 output_file.write(rss_feed.toxml('utf-8'))
             finally:
@@ -109,6 +109,12 @@
 ################################################################################
 
 def generate_rss_feed(feed_file, details):
+    title = details['title']
+    link = "http://www.boost.org/" + details['link']
+    if sys.version_info < (3, 0):
+        title = title.encode('utf-8')
+        link = link.encode('utf-8')
+
     rss = xml.dom.minidom.parseString('''<?xml version="1.0" encoding="UTF-8"?>
 <rss version="2.0" xmlns:boostbook="urn:boost.org:boostbook">
   <channel>
@@ -121,8 +127,8 @@
   </channel>
 </rss>
 ''' % {
-    'title' : details['title'].encode('utf-8'),
-    'link' : "http://www.boost.org/" + details['link'],
+    'title' : title,
+    'link' : link,
     'description' : '',
     'language' : 'en-us',
     'copyright' : 'Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)'
Modified: website/public_html/beta/site-tools/boost_site/state.py
==============================================================================
--- website/public_html/beta/site-tools/boost_site/state.py	(original)
+++ website/public_html/beta/site-tools/boost_site/state.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -3,9 +3,9 @@
 # Distributed under the Boost Software License, Version 1.0.
 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
-import os
+import os, sys
 
-class StateParseError:
+class StateParseError(BaseException):
     None
 
 def load(file_path):
@@ -64,9 +64,15 @@
                         if(not key): raise StateParseError()
                         if(type == 'None'):
                             type = 'String'
-                            value = file.readline().decode('utf-8')
+                            if sys.version_info < (3, 0):
+                                value = file.readline().decode('utf-8')
+                            else:
+                                value = file.readline()
                         elif(type == 'String'):
-                            value = value + file.readline().decode('utf-8')
+                            if sys.version_info < (3, 0):
+                                value = value + file.readline().decode('utf-8')
+                            else:
+                                value = value + file.readline()
                         else:
                             raise StateParseError()
                     else:
@@ -78,36 +84,41 @@
     return state
 
 def save(state, file_path):
-    file = open(file_path, "w")
+    file = open(file_path, "wb")
     try:
         for record_key in sorted(state.keys()):
             record = state[record_key]
 
-            file.write("(")
-            file.write(record_key)
-            file.write("\n")
+            write(file, "(")
+            write(file, record_key)
+            write(file, "\n")
 
             for key in sorted(record.keys()):            
-                file.write("-")
-                file.write(key)
-                file.write("\n")
+                write(file, "-")
+                write(file, key)
+                write(file, "\n")
 
                 if record[key] is not None:
-                    if isinstance(record[key], basestring):
-                        file.write('"')
-                        file.write(record[key].replace("\n", "\n\"").encode('utf-8'))
-                        file.write("\n")
+                    if isinstance(record[key], str) or \
+                            (sys.version_info < (3,0) and isinstance(record[key], unicode)):
+                        write(file, '"')
+                        write(file, record[key].replace("\n", "\n\""))
+                        write(file, "\n")
                     elif isinstance(record[key], bool):
-                        file.write('!')
-                        file.write(str(record[key]))
-                        file.write("\n")
+                        write(file, '!')
+                        write(file, str(record[key]))
+                        write(file, "\n")
                     elif isinstance(record[key], (int, float)):
-                        file.write('.')
-                        file.write(str(record[key]))
-                        file.write("\n")
+                        write(file, '.')
+                        write(file, str(record[key]))
+                        write(file, "\n")
                     else:
+                        print(type(record[key]))
                         assert False
 
-            file.write(")\n")
+            write(file, ")\n")
     finally:
         file.close()
+
+def write(file, str):
+    file.write(str.encode('utf-8'))
\ No newline at end of file
Modified: website/public_html/beta/site-tools/boost_site/upgrade.py
==============================================================================
--- website/public_html/beta/site-tools/boost_site/upgrade.py	(original)
+++ website/public_html/beta/site-tools/boost_site/upgrade.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -66,10 +66,10 @@
     version = Version()
 
     if(version.version < len(versions)):
-        print "Upgrading to new version."
+        print("Upgrading to new version.")
 
         for v in range(version.version, len(versions)):
-            print "Upgrade", v + 1
+            print("Upgrade " + (v + 1))
             versions[v]()
             version.version = v + 1
             version.save()
Modified: website/public_html/beta/site-tools/boost_site/util.py
==============================================================================
--- website/public_html/beta/site-tools/boost_site/util.py	(original)
+++ website/public_html/beta/site-tools/boost_site/util.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -3,7 +3,12 @@
 # Distributed under the Boost Software License, Version 1.0.
 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 
-import urlparse, re, string
+import sys, re, string
+
+try:
+    from urllib.parse import urljoin
+except ImportError:
+    from urlparse import urljoin
 
 def htmlencode(text):
     return text.replace('&', '&').replace('<', '<').replace('>', '&rt;')
@@ -16,11 +21,10 @@
     http://bugs.python.org/issue9883
     """
     x = ''.join(x.toxml('utf-8').decode('utf-8') for x in fragment.childNodes)
-    x = re.sub(r' +$', '', x, flags = re.M)
-    return x
+    return re.compile(r' +$', flags = re.M).sub('', x)
 
 def base_links(node, base_link):
-    transform_links(node, lambda x: urlparse.urljoin(base_link,x))
+    transform_links(node, lambda x: urljoin(base_link, x))
 
 def transform_links(node, func):
     transform_links_impl(node, 'a', 'href', func)
@@ -37,18 +41,27 @@
 
 def write_template(dst_path, template_path, data):
     file = open(template_path)
-    s = string.Template(file.read().decode('utf-8'))
+    if sys.version_info < (3, 0):
+        s = string.Template(file.read().decode('utf-8'))
+    else:
+        s = string.Template(file.read())
     output = s.substitute(data)
-    output = re.sub(r' +$', '', output, flags = re.M)
-    out = open(dst_path, "w")
-    out.write(output.encode('utf-8'))
+    output = re.compile(r' +$', flags = re.M).sub('', output)
+    out = open(dst_path, 'w')
+    if sys.version_info < (3, 0):
+        out.write(output.encode('utf-8'))
+    else:
+        out.write(output)
 
 def write_py_template(dst_path, template_path, data):
     data['emit'] = Emitter()
     exec(open(template_path).read(), {}, data)
 
     out = open(dst_path, 'w')
-    out.write(data['emit'].output.encode('utf-8'))
+    if sys.version_info < (3, 0):
+        out.write(data['emit'].output.encode('utf-8'))
+    else:
+        out.write(data['emit'].output)
 
 class Emitter:
     def __init__(self):
Modified: website/public_html/beta/site-tools/release.py
==============================================================================
--- website/public_html/beta/site-tools/release.py	(original)
+++ website/public_html/beta/site-tools/release.py	2012-05-27 08:48:44 EDT (Sun, 27 May 2012)
@@ -12,24 +12,24 @@
 import boost_site.site_tools
 
 if len(sys.argv) != 2:
-    print __doc__
+    print(__doc__)
     exit(1)
 
 # Because I'm an idiot, we need to get the real path to the quickbook file
 # before calling init.
 
 if not os.path.isfile(sys.argv[1]):
-    print "Unable to find release notes at:", sys.argv[1]
+    print("Unable to find release notes at: " + sys.argv[1])
     exit(1)
 
 release_notes = os.path.realpath(sys.argv[1])
 
 boost_site.site_tools.init()
 
-# Note: Not using os.path.relpath because I want to support Python 2.5
+# Note: Not using os.path.realpath because I want to support Python 2.5
 cwd = os.getcwd()
 if not release_notes.startswith(cwd):
-    print "Release notes aren't in current site:", sys.argv[1]
+    print("Release notes aren't in current site: " + sys.argv[1])
     exit(1)
 
 release_notes = release_notes[len(cwd):].lstrip('/')
@@ -39,7 +39,7 @@
 
 # Flag the released page
 if release_notes not in pages.pages:
-    print "Unable to find page:", release_notes
+    print("Unable to find page: " + release_notes)
     exit(1)
 pages.pages[release_notes].flags.add('released')
 pages.save()