You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2015/09/30 21:25:41 UTC

[1/3] allura git commit: [#7980] set default line length settings for pep8 & flake8

Repository: allura
Updated Branches:
  refs/heads/db/7980 579b34ab4 -> 275a16aed (forced update)


[#7980] set default line length settings for pep8 & flake8


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/275a16ae
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/275a16ae
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/275a16ae

Branch: refs/heads/db/7980
Commit: 275a16aedf1b6b2d75883e9fd459d7d57b6f236e
Parents: f2bd03c
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Sep 30 10:53:49 2015 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Wed Sep 30 10:53:59 2015 -0400

----------------------------------------------------------------------
 ForgeActivity/setup.cfg   |  6 ++++++
 ForgeBlog/setup.cfg       |  6 ++++++
 ForgeChat/setup.cfg       |  6 ++++++
 ForgeDiscussion/setup.cfg |  6 ++++++
 ForgeGit/setup.cfg        |  6 ++++++
 ForgeLink/setup.cfg       |  6 ++++++
 ForgeSVN/setup.cfg        |  6 ++++++
 ForgeTracker/setup.cfg    |  6 ++++++
 ForgeWiki/setup.cfg       |  6 ++++++
 setup.cfg                 | 22 ++++++++++++++++++++++
 10 files changed, 76 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeActivity/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeActivity/setup.cfg b/ForgeActivity/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeActivity/setup.cfg
+++ b/ForgeActivity/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeBlog/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeBlog/setup.cfg b/ForgeBlog/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeBlog/setup.cfg
+++ b/ForgeBlog/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeChat/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeChat/setup.cfg b/ForgeChat/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeChat/setup.cfg
+++ b/ForgeChat/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeDiscussion/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/setup.cfg b/ForgeDiscussion/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeDiscussion/setup.cfg
+++ b/ForgeDiscussion/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeGit/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeGit/setup.cfg b/ForgeGit/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeGit/setup.cfg
+++ b/ForgeGit/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeLink/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeLink/setup.cfg b/ForgeLink/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeLink/setup.cfg
+++ b/ForgeLink/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeSVN/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeSVN/setup.cfg b/ForgeSVN/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeSVN/setup.cfg
+++ b/ForgeSVN/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeTracker/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeTracker/setup.cfg b/ForgeTracker/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeTracker/setup.cfg
+++ b/ForgeTracker/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/ForgeWiki/setup.cfg
----------------------------------------------------------------------
diff --git a/ForgeWiki/setup.cfg b/ForgeWiki/setup.cfg
index 2637327..f054a10 100644
--- a/ForgeWiki/setup.cfg
+++ b/ForgeWiki/setup.cfg
@@ -1,2 +1,8 @@
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0

http://git-wip-us.apache.org/repos/asf/allura/blob/275a16ae/setup.cfg
----------------------------------------------------------------------
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..1ba576a
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,22 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119


[3/3] allura git commit: [#7980] Fix many pep8 / pyflakes and related issues

Posted by br...@apache.org.
[#7980] Fix many pep8 / pyflakes and related issues

* line length
* legit uses of has_key
* unused vars
* unused imports
* etc


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/f2bd03c7
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/f2bd03c7
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/f2bd03c7

Branch: refs/heads/db/7980
Commit: f2bd03c7424a753afc76a0736d203bc084f73d3e
Parents: aa6e158
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Sep 30 09:48:31 2015 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Wed Sep 30 10:53:59 2015 -0400

----------------------------------------------------------------------
 Allura/allura/command/__init__.py               |   5 +
 .../allura/command/create_trove_categories.py   |  66 ++++-----
 Allura/allura/controllers/__init__.py           |   8 +-
 Allura/allura/controllers/auth.py               |  12 +-
 Allura/allura/lib/helpers.py                    |  53 +++----
 Allura/allura/lib/widgets/__init__.py           |   4 +
 Allura/allura/lib/widgets/forms.py              |  40 +++--
 Allura/allura/model/__init__.py                 |  15 +-
 Allura/allura/model/repo.py                     |   5 +
 Allura/allura/model/repository.py               |  34 +++--
 Allura/allura/tests/functional/test_auth.py     | 105 +++++++------
 Allura/allura/tests/functional/test_discuss.py  |  30 ++--
 .../tests/functional/test_neighborhood.py       |  55 +++----
 Allura/allura/tests/functional/test_rest.py     |   6 +-
 .../tests/functional/test_user_profile.py       |   6 +-
 Allura/allura/tests/test_globals.py             |  34 +++--
 Allura/allura/tests/test_utils.py               |  22 +--
 Allura/allura/websetup/bootstrap.py             |  38 ++---
 Allura/setup.cfg                                |   6 +
 .../forgeactivity/tests/functional/test_rest.py |   6 +-
 .../forgeblog/tests/functional/test_rest.py     |   6 +-
 .../tests/functional/test_forum.py              |  92 ++++++------
 .../tests/functional/test_forum_admin.py        |  23 ++-
 .../tests/functional/test_rest.py               |  11 +-
 .../forgediscussion/widgets/__init__.py         |   4 +
 .../tests/functional/test_controllers.py        | 148 ++++++++-----------
 .../tests/google/test_extractor.py              |  23 ++-
 .../forgelink/tests/functional/test_rest.py     |   6 +-
 .../forgetracker/tests/functional/test_rest.py  |   6 +-
 .../forgetracker/tests/functional/test_root.py  |  77 +++++-----
 .../forgewiki/tests/functional/test_rest.py     |   6 +-
 .../forgewiki/tests/functional/test_root.py     |  23 ++-
 scripts/teamforge-import.py                     |  20 +--
 33 files changed, 499 insertions(+), 496 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/command/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/__init__.py b/Allura/allura/command/__init__.py
index 24254aa..0221b7b 100644
--- a/Allura/allura/command/__init__.py
+++ b/Allura/allura/command/__init__.py
@@ -22,3 +22,8 @@ from smtp_server import SMTPServerCommand
 from create_neighborhood import CreateNeighborhoodCommand, UpdateNeighborhoodCommand
 from create_trove_categories import CreateTroveCategoriesCommand
 from set_neighborhood_features import SetNeighborhoodFeaturesCommand
+
+__all__ = [
+    'Command', 'ShowModelsCommand', 'ReindexCommand', 'EnsureIndexCommand', 'ScriptCommand', 'SetToolAccessCommand',
+    'SMTPServerCommand', 'CreateNeighborhoodCommand', 'UpdateNeighborhoodCommand', 'CreateTroveCategoriesCommand',
+    'SetNeighborhoodFeaturesCommand']

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/command/create_trove_categories.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/create_trove_categories.py b/Allura/allura/command/create_trove_categories.py
index eba9244..288117c 100644
--- a/Allura/allura/command/create_trove_categories.py
+++ b/Allura/allura/command/create_trove_categories.py
@@ -233,7 +233,7 @@ class CreateTroveCategoriesCommand(base.Command):
                                "User Interface :: Toolkits/Libraries :: ClanLib", True))
         self.create_trove_cat(
             (516, 500, "db_group_objmap", "Project is a relational object mapper",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a relational object mapper",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a relational object mapper",  # nopep8
              True))
         self.create_trove_cat(
             (487, 458, "ui_ggi", "GGI", "User Interface :: Toolkits/Libraries :: GGI", True))
@@ -245,7 +245,7 @@ class CreateTroveCategoriesCommand(base.Command):
                                "User Interface :: Toolkits/Libraries :: wxWidgets", True))
         self.create_trove_cat(
             (511, 500, "db_group_mgmt", "Project is a database management tool",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database management tool",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database management tool",  # nopep8
              True))
         self.create_trove_cat(
             (479, 458, "ui_qt", "Qt", "User Interface :: Toolkits/Libraries :: Qt", True))
@@ -253,7 +253,7 @@ class CreateTroveCategoriesCommand(base.Command):
             (477, 458, "ui_gtk", "GTK+", "User Interface :: Toolkits/Libraries :: GTK+", True))
         self.create_trove_cat(
             (513, 500, "db_group_netdbms", "Project is a network-based DBMS (database system)",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a network-based DBMS (database system)",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a network-based DBMS (database system)",  # nopep8
              True))
         self.create_trove_cat(
             (228, 458, "newt", "Newt", "User Interface :: Toolkits/Libraries :: Newt", True))
@@ -261,7 +261,7 @@ class CreateTroveCategoriesCommand(base.Command):
                                "User Interface :: Toolkits/Libraries :: Curses/Ncurses", True))
         self.create_trove_cat(
             (515, 500, "db_group_conv", "Project is a database conversion tool",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database conversion tool",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database conversion tool",  # nopep8
              True))
         self.create_trove_cat(
             (478, 458, "ui_tk", "Tk", "User Interface :: Toolkits/Libraries :: Tk", True))
@@ -271,7 +271,7 @@ class CreateTroveCategoriesCommand(base.Command):
                                "Topic :: Communications :: Email :: Post-Office", True))
         self.create_trove_cat(
             (514, 500, "db_group_propfmt", "Project is a tool for a proprietary database file format",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a tool for a proprietary database file format",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a tool for a proprietary database file format",  # nopep8
              True))
         self.create_trove_cat(
             (482, 458, "ui_aalib", "AAlib", "User Interface :: Toolkits/Libraries :: AAlib", True))
@@ -279,7 +279,7 @@ class CreateTroveCategoriesCommand(base.Command):
             (484, 458, "ui_fltk", "FLTK", "User Interface :: Toolkits/Libraries :: FLTK", True))
         self.create_trove_cat(
             (512, 500, "db_group_filedbms", "Project is a file-based DBMS (database system)",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a file-based DBMS (database system)",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a file-based DBMS (database system)",  # nopep8
              True))
         self.create_trove_cat(
             (486, 458, "ui_plib", "Plib", "User Interface :: Toolkits/Libraries :: Plib", True))
@@ -287,7 +287,7 @@ class CreateTroveCategoriesCommand(base.Command):
             (488, 458, "ui_glide", "Glide", "User Interface :: Toolkits/Libraries :: Glide", True))
         self.create_trove_cat(
             (510, 500, "db_group_api", "Project is a database abstraction layer (API)",
-             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database abstraction layer (API)",
+             "Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database abstraction layer (API)",  # nopep8
              True))
         self.create_trove_cat(
             (490, 458, "ui_glut", "GLUT", "User Interface :: Toolkits/Libraries :: GLUT", True))
@@ -828,14 +828,14 @@ class CreateTroveCategoriesCommand(base.Command):
             (441, 315, "ecos", "eCos", "Operating System :: Handheld/Embedded Operating Systems :: eCos", True))
         self.create_trove_cat(
             (
-            443, 315, "vxworks", "VxWorks", "Operating System :: Handheld/Embedded Operating Systems :: VxWorks", True))
+            443, 315, "vxworks", "VxWorks", "Operating System :: Handheld/Embedded Operating Systems :: VxWorks", True))  # nopep8
         self.create_trove_cat((444, 315, "symbianos", "SymbianOS",
                                "Operating System :: Handheld/Embedded Operating Systems :: SymbianOS", True))
         self.create_trove_cat(
             (442, 315, "qnx", "QNX", "Operating System :: Handheld/Embedded Operating Systems :: QNX", True))
         self.create_trove_cat(
             (
-            440, 315, "uclinux", "uClinux", "Operating System :: Handheld/Embedded Operating Systems :: uClinux", True))
+            440, 315, "uclinux", "uClinux", "Operating System :: Handheld/Embedded Operating Systems :: uClinux", True))  # nopep8
         self.create_trove_cat(
             (418, 199, "modern_oses", "Modern (Vendor-Supported) Desktop Operating Systems",
              "Operating System :: Modern (Vendor-Supported) Desktop Operating Systems", True))
@@ -871,13 +871,13 @@ class CreateTroveCategoriesCommand(base.Command):
             (634, 236, "console-platforms", "Console-based Platforms",
              "Operating System :: Other Operating Systems :: Console-based Platforms", True))
         self.create_trove_cat((637, 634, "sega-dreamcast", "Sega Dreamcast",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Sega Dreamcast",
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Sega Dreamcast",  # nopep8
                                True))
         self.create_trove_cat((635, 634, "xbox", "Microsoft Xbox",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox",
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox",  # nopep8
                                True))
         self.create_trove_cat((636, 634, "sony-ps2", "Sony Playstation 2",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Sony Playstation 2",
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Sony Playstation 2",  # nopep8
                                True))
         self.create_trove_cat(
             (422, 236, "mswin_98", "Win98", "Operating System :: Other Operating Systems :: Win98", True))
@@ -923,11 +923,11 @@ class CreateTroveCategoriesCommand(base.Command):
              "Operating System :: Grouping and Descriptive Categories :: Project is OS Distribution-Specific", True))
         self.create_trove_cat(
             (449, 432, "eightbit_oses", "Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)",
-             "Operating System :: Grouping and Descriptive Categories :: Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)",
+             "Operating System :: Grouping and Descriptive Categories :: Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)",  # nopep8
              True))
         self.create_trove_cat(
             (436, 432, "os_portable", "OS Portable (Source code to work with many OS platforms)",
-             "Operating System :: Grouping and Descriptive Categories :: OS Portable (Source code to work with many OS platforms)",
+             "Operating System :: Grouping and Descriptive Categories :: OS Portable (Source code to work with many OS platforms)",  # nopep8
              True))
         self.create_trove_cat(
             (438, 432, "os_projectdistro", "Project is an Operating System Distribution",
@@ -935,7 +935,7 @@ class CreateTroveCategoriesCommand(base.Command):
              True))
         self.create_trove_cat(
             (235, 432, "independent", "OS Independent (Written in an interpreted language)",
-             "Operating System :: Grouping and Descriptive Categories :: OS Independent (Written in an interpreted language)",
+             "Operating System :: Grouping and Descriptive Categories :: OS Independent (Written in an interpreted language)",  # nopep8
              True))
         self.create_trove_cat(
             (200, 432, "posix", "All POSIX (Linux/BSD/UNIX-like OSes)",
@@ -945,7 +945,7 @@ class CreateTroveCategoriesCommand(base.Command):
              "Operating System :: Grouping and Descriptive Categories :: 32-bit MS Windows (NT/2000/XP)", True))
         self.create_trove_cat(
             (202, 432, "bsd", "All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)",
-             "Operating System :: Grouping and Descriptive Categories :: All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)",
+             "Operating System :: Grouping and Descriptive Categories :: All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)",  # nopep8
              True))
         self.create_trove_cat(
             (435, 432, "mswin_all32bit", "All 32-bit MS Windows (95/98/NT/2000/XP)",
@@ -1107,7 +1107,7 @@ class CreateTroveCategoriesCommand(base.Command):
         self.create_trove_cat((57, 55, "kde", "K Desktop Environment (KDE)",
                                "Topic :: Desktop Environment :: K Desktop Environment (KDE)", True))
         self.create_trove_cat(
-            (61, 57, "themes", "Themes", "Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes", True))
+            (61, 57, "themes", "Themes", "Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes", True))  # nopep8
         self.create_trove_cat(
             (58, 55, "gnome", "Gnome", "Topic :: Desktop Environment :: Gnome", True))
         self.create_trove_cat((62, 55, "screensavers", "Screen Savers",
@@ -1473,7 +1473,7 @@ class CreateTroveCategoriesCommand(base.Command):
              "Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Windows 7", True))
         self.create_trove_cat(
             (
-            728, 315, "android", "Android", "Operating System :: Handheld/Embedded Operating Systems :: Android", True))
+            728, 315, "android", "Android", "Operating System :: Handheld/Embedded Operating Systems :: Android", True))  # nopep8
         self.create_trove_cat((780, 315, "ios", "Apple iPhone",
                                "Operating System :: Handheld/Embedded Operating Systems :: Apple iPhone", True))
         self.create_trove_cat((863, 534, "architects", "Architects",
@@ -1564,7 +1564,7 @@ class CreateTroveCategoriesCommand(base.Command):
         self.create_trove_cat((673, 576, "bsm", "Business Service Management",
                                "Topic :: Office/Business :: Enterprise :: Business Service Management"))
         self.create_trove_cat((674, 673, "servicesupport", "Service Support",
-                               "Topic :: Office/Business :: Enterprise :: Business Service Management :: Service Support"))
+                               "Topic :: Office/Business :: Enterprise :: Business Service Management :: Service Support"))  # nopep8
         self.create_trove_cat(
             (675, 673, "serviceassurance", "Service Assurance",
              "Topic :: Office/Business :: Enterprise :: Business Service Management :: Service Assurance"))
@@ -1593,14 +1593,14 @@ class CreateTroveCategoriesCommand(base.Command):
              "License :: OSI-Approved Open Source :: Simple Public License 2.0"))
         self.create_trove_cat(
             (687, 673, "cmdb", "Configuration Management Database (CMDB)",
-             "Topic :: Office/Business :: Enterprise :: Business Service Management :: Configuration Management Database (CMDB)"))
+             "Topic :: Office/Business :: Enterprise :: Business Service Management :: Configuration Management Database (CMDB)"))  # nopep8
         self.create_trove_cat(
             (688, 18, "mobileapps", "Mobile", "Topic :: Mobile"))
         self.create_trove_cat((689, 315, "winmobile", "Windows Mobile",
                                "Operating System :: Handheld/Embedded Operating Systems :: Windows Mobile"))
         self.create_trove_cat(
             (690, 315, "brew", "BREW (Binary Runtime Environment for Wireless)",
-             "Operating System :: Handheld/Embedded Operating Systems :: BREW (Binary Runtime Environment for Wireless)"))
+             "Operating System :: Handheld/Embedded Operating Systems :: BREW (Binary Runtime Environment for Wireless)"))  # nopep8
         self.create_trove_cat(
             (691, 315, "j2me", "J2ME (Java Platform, Micro Edition)",
              "Operating System :: Handheld/Embedded Operating Systems :: J2ME (Java Platform, Micro Edition)"))
@@ -1658,16 +1658,16 @@ class CreateTroveCategoriesCommand(base.Command):
             (717, 160, "proglangmeta", "Project is a programming language",
              "Programming Language :: Project is a programming language"))
         self.create_trove_cat((718, 634, "msxb360", "Microsoft Xbox 360",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox 360"))
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox 360"))  # nopep8
         self.create_trove_cat((719, 634, "nintendogc", "Nintendo GameCube",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Nintendo GameCube"))
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Nintendo GameCube"))  # nopep8
         self.create_trove_cat((720, 634, "nintendowii", "Nintendo Wii",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Nintendo Wii"))
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Nintendo Wii"))  # nopep8
         self.create_trove_cat((721, 634, "sonyps3", "Sony PlayStation 3",
-                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Sony PlayStation 3"))
+                               "Operating System :: Other Operating Systems :: Console-based Platforms :: Sony PlayStation 3"))  # nopep8
         self.create_trove_cat(
             (722, 634, "sonypsp", "Sony PlayStation Portable (PSP)",
-             "Operating System :: Other Operating Systems :: Console-based Platforms :: Sony PlayStation Portable (PSP)"))
+             "Operating System :: Other Operating Systems :: Console-based Platforms :: Sony PlayStation Portable (PSP)"))  # nopep8
         self.create_trove_cat(
             (723, 160, "scilab", "Scilab", "Programming Language :: Scilab"))
         self.create_trove_cat(
@@ -1685,10 +1685,10 @@ class CreateTroveCategoriesCommand(base.Command):
             (730, 274, "basque", "Basque (Euskara)", "Translations :: Basque (Euskara)"))
         self.create_trove_cat(
             (731, 14, "classpath", "GNU General Public License with Classpath exception (Classpath::License)",
-             "License :: OSI-Approved Open Source :: GNU General Public License with Classpath exception (Classpath::License)"))
+             "License :: OSI-Approved Open Source :: GNU General Public License with Classpath exception (Classpath::License)"))  # nopep8
         self.create_trove_cat(
             (732, 727, "caddcam", "Computer-aided technologies (CADD/CAM/CAE)",
-             "Topic :: Scientific/Engineering :: Mechanical and Civil Engineering :: Computer-aided technologies (CADD/CAM/CAE)"))
+             "Topic :: Scientific/Engineering :: Mechanical and Civil Engineering :: Computer-aided technologies (CADD/CAM/CAE)"))  # nopep8
         self.create_trove_cat((733, 576, "humanresources", "Human Resources",
                                "Topic :: Office/Business :: Enterprise :: Human Resources"))
         self.create_trove_cat(
@@ -1983,7 +1983,7 @@ class CreateTroveCategoriesCommand(base.Command):
         self.update_trove_cat(
             16, dict(
                 fullname="GNU Library or Lesser General Public License version 2.0 (LGPLv2)",
-                fullpath="License :: OSI-Approved Open Source :: GNU Library or Lesser General Public License version 2.0 (LGPLv2)"))
+                fullpath="License :: OSI-Approved Open Source :: GNU Library or Lesser General Public License version 2.0 (LGPLv2)"))  # nopep8
         self.update_trove_cat(
             15, dict(fullname="GNU General Public License version 2.0 (GPLv2)",
                      fullpath="License :: OSI-Approved Open Source :: GNU General Public License version 2.0 (GPLv2)"))
@@ -1995,16 +1995,16 @@ class CreateTroveCategoriesCommand(base.Command):
              "License :: Creative Commons Attribution License"))
         self.create_trove_cat(
             (869, 868, "ccaslv2", "Creative Commons Attribution ShareAlike License V2.0",
-             "License :: Creative Commons Attribution License :: Creative Commons Attribution ShareAlike License V2.0"))
+             "License :: Creative Commons Attribution License :: Creative Commons Attribution ShareAlike License V2.0"))  # nopep8
         self.create_trove_cat(
             (870, 868, "ccaslv3", "Creative Commons Attribution ShareAlike License V3.0",
-             "License :: Creative Commons Attribution License :: Creative Commons Attribution ShareAlike License V3.0"))
+             "License :: Creative Commons Attribution License :: Creative Commons Attribution ShareAlike License V3.0"))  # nopep8
         self.create_trove_cat(
             (871, 868, "ccanclv2", "Creative Commons Attribution Non-Commercial License V2.0",
-             "License :: Creative Commons Attribution License :: Creative Commons Attribution Non-Commercial License V2.0"))
+             "License :: Creative Commons Attribution License :: Creative Commons Attribution Non-Commercial License V2.0"))  # nopep8
         self.create_trove_cat(
             (680, 14, "lgplv3", "GNU Library or Lesser General Public License version 3.0 (LGPLv3)",
-             "License :: OSI-Approved Open Source :: GNU Library or Lesser General Public License version 3.0 (LGPLv3)"))
+             "License :: OSI-Approved Open Source :: GNU Library or Lesser General Public License version 3.0 (LGPLv3)"))  # nopep8
         self.create_trove_cat(
             (679, 14, "gplv3", "GNU General Public License version 3.0 (GPLv3)",
              "License :: OSI-Approved Open Source :: GNU General Public License version 3.0 (GPLv3)"))

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/controllers/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/__init__.py b/Allura/allura/controllers/__init__.py
index a69bafb..417b8ad 100644
--- a/Allura/allura/controllers/__init__.py
+++ b/Allura/allura/controllers/__init__.py
@@ -18,6 +18,10 @@
 #       under the License.
 
 """Controllers for the allura application."""
-from .discuss import DiscussionController, AppDiscussionController, ThreadController, PostController, ModerationController
-from .discuss import AppDiscussionRestController
+from .discuss import DiscussionController, AppDiscussionController, ThreadController, PostController
+from .discuss import ModerationController, AppDiscussionRestController
 from .base import BaseController, DispatchIndex
+
+__all__ = [
+    'DiscussionController', 'AppDiscussionController', 'ThreadController', 'PostController', 'ModerationController',
+    'AppDiscussionRestController', 'BaseController', 'DispatchIndex']

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/controllers/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index f4f03c9..e3c4d38 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -51,6 +51,7 @@ from allura.controllers import BaseController
 
 log = logging.getLogger(__name__)
 
+
 class F(object):
     login_form = LoginForm()
     password_change_form = forms.PasswordChangeForm(action='/auth/preferences/change_password')
@@ -183,20 +184,19 @@ class AuthController(BaseController):
         user_record = M.User.by_email_address(email)
         allow_non_primary_email_reset = asbool(config.get('auth.allow_non_primary_email_password_reset', True))
 
-
         if not re.match(r"[^@]+@[^@]+\.[^@]+", email):
             flash('Enter email in correct format!','error')
             redirect('/auth/forgotten_password')
 
         if not allow_non_primary_email_reset:
-            message = 'If the given email address is on record, a password reset email has been sent to the account\'s primary email address.'
+            message = 'If the given email address is on record, '\
+                      'a password reset email has been sent to the account\'s primary email address.'
             email_record = M.EmailAddress.get(email=provider.get_primary_email_address(user_record=user_record),
                                                     confirmed=True)
         else:
             message = 'A password reset email has been sent, if the given email address is on record in our system.'
             email_record = M.EmailAddress.get(email=email, confirmed=True)
 
-
         if user_record and email_record and email_record.confirmed:
             hash = h.nonce(42)
             user_record.set_tool_data('AuthPasswordReset',
@@ -459,10 +459,8 @@ class PreferencesController(BaseController):
         # not using **kw in method signature, to ensure 'admin' can't be passed in via a form submit
         kw = form_params
         addr = kw.pop('addr', None)
-        new_addr= kw.pop('new_addr', None)
+        new_addr = kw.pop('new_addr', None)
         primary_addr = kw.pop('primary_addr', None)
-        oid = kw.pop('oid', None)
-        new_oid = kw.pop('new_oid', None)
         provider = plugin.AuthenticationProvider.get(request)
         for i, (old_a, data) in enumerate(zip(user.email_addresses, addr or [])):
             obj = user.address_object(old_a)
@@ -1011,7 +1009,7 @@ class OAuthController(BaseController):
             validation_pin=h.nonce(20),
             is_bearer=True,
         )
-        access_token = M.OAuthAccessToken(
+        M.OAuthAccessToken(
             consumer_token_id=consumer_token._id,
             request_token_id=c.user._id,
             user_id=request_token.user_id,

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index 68330ba..bf5a580 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -133,9 +133,11 @@ def make_safe_path_portion(ustr, relaxed=True):
     s = s.replace('--', '-')
     return s
 
+
 def escape_json(data):
     return json.dumps(data).replace('<', '\u003C')
 
+
 def monkeypatch(*objs):
     def patchem(func):
         for obj in objs:
@@ -695,9 +697,9 @@ def paging_sanitizer(limit, page, total_count, zero_based_pages=True):
     return limit, page
 
 
-def _add_inline_line_numbers_to_text(text):
+def _add_inline_line_numbers_to_text(txt):
     markup_text = '<div class="codehilite"><pre>'
-    for line_num, line in enumerate(text.splitlines(), 1):
+    for line_num, line in enumerate(txt.splitlines(), 1):
         markup_text = markup_text + \
             '<span id="l%s" class="code_block"><span class="lineno">%s</span> %s</span>' % (
                 line_num, line_num, line)
@@ -705,7 +707,7 @@ def _add_inline_line_numbers_to_text(text):
     return markup_text
 
 
-def _add_table_line_numbers_to_text(text):
+def _add_table_line_numbers_to_text(txt):
     def _prepend_whitespaces(num, max_num):
         num, max_num = str(num), str(max_num)
         diff = len(max_num) - len(num)
@@ -715,7 +717,7 @@ def _add_table_line_numbers_to_text(text):
         max_num = l + start
         return '\n'.join(map(_prepend_whitespaces, range(start, max_num), [max_num] * l))
 
-    lines = text.splitlines(True)
+    lines = txt.splitlines(True)
     linenumbers = '<td class="linenos"><div class="linenodiv"><pre>' + \
         _len_to_str_column(len(lines)) + '</pre></div></td>'
     markup_text = '<table class="codehilitetable"><tbody><tr>' + \
@@ -731,28 +733,28 @@ INLINE = 'inline'
 TABLE = 'table'
 
 
-def render_any_markup(name, text, code_mode=False, linenumbers_style=TABLE):
+def render_any_markup(name, txt, code_mode=False, linenumbers_style=TABLE):
     """
     renders markdown using allura enhacements if file is in markdown format
     renders any other markup format using the pypeline
     Returns jinja-safe text
     """
-    if text == '':
-        text = '<p><em>Empty File</em></p>'
+    if txt == '':
+        txt = '<p><em>Empty File</em></p>'
     else:
         fmt = g.pypeline_markup.can_render(name)
         if fmt == 'markdown':
-            text = g.markdown.convert(text)
+            txt = g.markdown.convert(txt)
         else:
-            text = g.pypeline_markup.render(name, text)
+            txt = g.pypeline_markup.render(name, txt)
         if not fmt:
             if code_mode and linenumbers_style == INLINE:
-                text = _add_inline_line_numbers_to_text(text)
+                txt = _add_inline_line_numbers_to_text(txt)
             elif code_mode and linenumbers_style == TABLE:
-                text = _add_table_line_numbers_to_text(text)
+                txt = _add_table_line_numbers_to_text(txt)
             else:
-                text = '<pre>%s</pre>' % text
-    return Markup(text)
+                txt = '<pre>%s</pre>' % txt
+    return Markup(txt)
 
 # copied from jinja2 dev
 # latest release, 2.6, implements this incorrectly
@@ -1053,28 +1055,28 @@ def urlopen(url, retries=3, codes=(408, 500, 502, 503, 504), timeout=None):
                 raise e
 
 
-def plain2markdown(text, preserve_multiple_spaces=False, has_html_entities=False):
+def plain2markdown(txt, preserve_multiple_spaces=False, has_html_entities=False):
     if not has_html_entities:
         # prevent &foo; and &#123; from becoming HTML entities
-        text = re_amp.sub('&amp;', text)
+        txt = re_amp.sub('&amp;', txt)
     # avoid accidental 4-space indentations creating code blocks
     if preserve_multiple_spaces:
-        text = text.replace('\t', ' ' * 4)
-        text = re_preserve_spaces.sub('&nbsp;', text)
+        txt = txt.replace('\t', ' ' * 4)
+        txt = re_preserve_spaces.sub('&nbsp;', txt)
     else:
-        text = re_leading_spaces.sub('', text)
+        txt = re_leading_spaces.sub('', txt)
     try:
         # try to use html2text for most of the escaping
         import html2text
         html2text.BODY_WIDTH = 0
-        text = html2text.escape_md_section(text, snob=True)
+        txt = html2text.escape_md_section(txt, snob=True)
     except ImportError:
         # fall back to just escaping any MD-special chars
-        text = md_chars_matcher_all.sub(r"\\\1", text)
+        txt = md_chars_matcher_all.sub(r"\\\1", txt)
     # prevent < and > from becoming tags
-    text = re_angle_bracket_open.sub('&lt;', text)
-    text = re_angle_bracket_close.sub('&gt;', text)
-    return text
+    txt = re_angle_bracket_open.sub('&lt;', txt)
+    txt = re_angle_bracket_close.sub('&gt;', txt)
+    return txt
 
 
 def iter_entry_points(group, *a, **kw):
@@ -1166,7 +1168,7 @@ def login_overlay(exceptions=None):
     """
     try:
         yield
-    except HTTPUnauthorized as e:
+    except HTTPUnauthorized:
         if exceptions:
             for exception in exceptions:
                 if request.path.rstrip('/').endswith('/%s' % exception):
@@ -1251,7 +1253,6 @@ def rate_limit(cfg_opt, artifact_count, start_date, exception=None):
     now = datetime.utcnow()
     for rate, count in rate_limits.items():
         age = now - start_date
-        age = (age.microseconds +
-                (age.seconds + age.days * 24 * 3600) * 10 ** 6) / 10 ** 6
+        age = (age.microseconds + (age.seconds + age.days * 24 * 3600) * 10 ** 6) / 10 ** 6
         if age < int(rate) and artifact_count >= count:
             raise exception()

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/lib/widgets/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/__init__.py b/Allura/allura/lib/widgets/__init__.py
index 6e13a39..9d21e37 100644
--- a/Allura/allura/lib/widgets/__init__.py
+++ b/Allura/allura/lib/widgets/__init__.py
@@ -20,3 +20,7 @@ from .subscriptions import SubscriptionForm
 from .oauth_widgets import OAuthApplicationForm, OAuthRevocationForm
 from .auth_widgets import LoginForm, ForgottenPasswordForm, DisableAccountForm
 from .vote import VoteForm
+
+__all__ = [
+    'Post', 'Thread', 'Discussion', 'SubscriptionForm', 'OAuthApplicationForm', 'OAuthRevocationForm', 'LoginForm',
+    'ForgottenPasswordForm', 'DisableAccountForm', 'VoteForm']

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/lib/widgets/forms.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index cfbad2c..5d35788 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -18,7 +18,6 @@
 import logging
 import warnings
 
-from collections import defaultdict
 from pylons import app_globals as g, tmpl_context as c
 from formencode import validators as fev
 import formencode
@@ -686,13 +685,12 @@ class SelectSubCategoryForm(ForgeForm):
     def display(self, **kw):
         categories = kw.get('categories')
 
-        self.fields['selected_category'].options = \
-            [ew.Option(py_value=el.trove_cat_id, label=el.fullname)
-             for el in categories]
-        self.fields['selected_category'].validator = \
-            validator = formencode.All(
-                V.OneOfValidator(categories),
-                fev.UnicodeString(not_empty=True))
+        self.fields['selected_category'].options = [
+            ew.Option(py_value=el.trove_cat_id, label=el.fullname) for el in categories
+        ]
+        self.fields['selected_category'].validator = formencode.All(
+            V.OneOfValidator(categories),
+            fev.UnicodeString(not_empty=True))
         return super(ForgeForm, self).display(**kw)
 
 
@@ -830,18 +828,19 @@ class NeighborhoodOverviewForm(ForgeForm):
                 empty_val = False
                 if inp['value'] is None or inp['value'] == '':
                     empty_val = True
-                display += '<tr><td class="left"><label>%(label)s</label></td>'\
-                           '<td><input type="checkbox" name="%(ctx_name)s-%(inp_name)s-def" %(def_checked)s>default</td>'\
-                           '<td class="right"><div class="%(ctx_name)s-%(inp_name)s-inp"><table class="input_inner">'\
-                           '<tr><td><input type="text" class="%(inp_type)s" name="%(ctx_name)s-%(inp_name)s" '\
-                           'value="%(inp_value)s"></td><td>%(inp_additional)s</td></tr></table></div></td></tr>\n' % {'ctx_id': ctx['id'],
-                                                                                                                      'ctx_name': ctx['name'],
-                                                                                                                      'inp_name': inp['name'],
-                                                                                                                      'inp_value': inp['value'],
-                                                                                                                      'label': inp['label'],
-                                                                                                                      'inp_type': inp['type'],
-                                                                                                                      'def_checked': 'checked="checked"' if empty_val else '',
-                                                                                                                      'inp_additional': additional_inputs}
+                display += '<tr><td class="left"><label>%(label)s</label></td>' \
+                           '<td><input type="checkbox" name="%(ctx_name)s-%(inp_name)s-def" %(def_checked)s>default</td>' \
+                           '<td class="right"><div class="%(ctx_name)s-%(inp_name)s-inp"><table class="input_inner">' \
+                           '<tr><td><input type="text" class="%(inp_type)s" name="%(ctx_name)s-%(inp_name)s" ' \
+                           'value="%(inp_value)s"></td><td>%(inp_additional)s</td></tr></table></div></td></tr>\n' % {
+                               'ctx_id': ctx['id'],
+                               'ctx_name': ctx['name'],
+                               'inp_name': inp['name'],
+                               'inp_value': inp['value'],
+                               'label': inp['label'],
+                               'inp_type': inp['type'],
+                               'def_checked': 'checked="checked"' if empty_val else '',
+                               'inp_additional': additional_inputs}
             display += '</table>'
 
             if ctx['errors'] and field.show_errors and not ignore_errors:
@@ -1105,7 +1104,6 @@ class AwardGrantForm(ForgeForm):
         self._project_select_url = kw.pop('project_select_url', '')
         super(AwardGrantForm, self).__init__(*args, **kw)
 
-
     def award_options(self):
         return [ew.Option(py_value=a.short, label=a.short) for a in self._awards]
 

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/model/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/__init__.py b/Allura/allura/model/__init__.py
index 784d1af..cb817b4 100644
--- a/Allura/allura/model/__init__.py
+++ b/Allura/allura/model/__init__.py
@@ -22,7 +22,8 @@
 from .neighborhood import Neighborhood, NeighborhoodFile
 from .project import Project, ProjectCategory, TroveCategory, ProjectFile, AppConfig
 from .index import ArtifactReference, Shortlink
-from .artifact import Artifact, MovedArtifact, Message, VersionedArtifact, Snapshot, Feed, AwardFile, Award, AwardGrant, VotableArtifact
+from .artifact import Artifact, MovedArtifact, Message, VersionedArtifact, Snapshot, Feed, AwardFile, Award, AwardGrant
+from .artifact import VotableArtifact
 from .discuss import Discussion, Thread, PostHistory, Post, DiscussionAttachment
 from .attachments import BaseAttachment
 from .auth import AuthGlobals, User, ProjectRole, EmailAddress, OldProjectRole
@@ -48,3 +49,15 @@ from . import repo_refresh
 
 from ming.orm import Mapper
 Mapper.compile_all()
+
+__all__ = [
+    'Neighborhood', 'NeighborhoodFile', 'Project', 'ProjectCategory', 'TroveCategory', 'ProjectFile', 'AppConfig',
+    'ArtifactReference', 'Shortlink', 'Artifact', 'MovedArtifact', 'Message', 'VersionedArtifact', 'Snapshot', 'Feed',
+    'AwardFile', 'Award', 'AwardGrant', 'VotableArtifact', 'Discussion', 'Thread', 'PostHistory', 'Post',
+    'DiscussionAttachment', 'BaseAttachment', 'AuthGlobals', 'User', 'ProjectRole', 'EmailAddress', 'OldProjectRole',
+    'AuditLog', 'audit_log', 'AlluraUserProperty', 'File', 'Notification', 'Mailbox', 'Repository',
+    'RepositoryImplementation', 'MergeRequest', 'GitLikeTree', 'Stats', 'OAuthToken', 'OAuthConsumerToken',
+    'OAuthRequestToken', 'OAuthAccessToken', 'MonQTask', 'Webhook', 'ACE', 'ACL', 'EVERYONE', 'ALL_PERMISSIONS',
+    'DENY_ALL', 'MarkdownCache', 'main_doc_session', 'main_orm_session', 'project_doc_session', 'project_orm_session',
+    'artifact_orm_session', 'repository_orm_session', 'task_orm_session', 'ArtifactSessionExtension', 'repository',
+    'repo_refresh', ]

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index f041116..6ba6633 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -24,3 +24,8 @@ from .repository import QSIZE, README_RE, VIEWABLE_EXTENSIONS, PYPELINE_EXTENSIO
 from .repository import CommitDoc, TreeDoc, LastCommitDoc, TreesDoc, CommitRunDoc
 from .repository import RepoObject, Commit, Tree, Blob, LastCommit
 from .repository import ModelCache
+
+__all__ = [
+    'SUser', 'SObjType', 'QSIZE', 'README_RE', 'VIEWABLE_EXTENSIONS', 'PYPELINE_EXTENSIONS',
+    'DIFF_SIMILARITY_THRESHOLD', 'CommitDoc', 'TreeDoc', 'LastCommitDoc', 'TreesDoc', 'CommitRunDoc', 'RepoObject',
+    'Commit', 'Tree', 'Blob', 'LastCommit', 'ModelCache']

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 77c3fc4..75ed2dc 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -30,7 +30,7 @@ from urlparse import urljoin
 from threading import Thread
 from Queue import Queue
 from itertools import chain
-from difflib import SequenceMatcher, unified_diff
+from difflib import SequenceMatcher
 
 import tg
 from paste.deploy.converters import asint, asbool
@@ -56,7 +56,7 @@ from .timeline import ActivityObject
 from .monq_model import MonQTask
 from .project import AppConfig
 from .session import main_doc_session
-from .session import repository_orm_session, artifact_orm_session
+from .session import repository_orm_session
 
 
 log = logging.getLogger(__name__)
@@ -78,18 +78,20 @@ SObjType = S.OneOf('blob', 'tree', 'submodule')
 # Used for when we're going to batch queries using $in
 QSIZE = 100
 BINARY_EXTENSIONS = frozenset([
-    ".3ds", ".3g2", ".3gp", ".7z", ".a", ".aac", ".adp", ".ai", ".aif", ".apk", ".ar", ".asf", ".au", ".avi",
-    ".bak", ".bin", ".bk", ".bmp", ".btif", ".bz2", ".cab", ".caf", ".cgm", ".cmx", ".cpio", ".cr2", ".dat", ".deb", ".djvu", ".dll",
-    ".dmg", ".dng", ".doc", ".docx", ".dra", ".DS_Store", ".dsk", ".dts", ".dtshd", ".dvb", ".dwg", ".dxf", ".ecelp4800",
-    ".ecelp7470", ".ecelp9600", ".egg", ".eol", ".eot", ".epub", ".exe", ".f4v", ".fbs", ".fh", ".fla", ".flac", ".fli", ".flv",
-    ".fpx", ".fst", ".fvt", ".g3", ".gif", ".gz", ".h261", ".h263", ".h264", ".ico", ".ief", ".img", ".ipa", ".iso", ".jar", ".jpeg",
-    ".jpg", ".jpgv", ".jpm", ".jxr", ".ktx", ".lvp", ".lz", ".lzma", ".lzo", ".m3u", ".m4a", ".m4v", ".mar", ".mdi", ".mid", ".mj2",
-    ".mka", ".mkv", ".mmr", ".mng", ".mov", ".movie", ".mp3", ".mp4", ".mp4a", ".mpeg", ".mpg", ".mpga", ".mxu", ".nef", ".npx", ".o",
-    ".oga", ".ogg", ".ogv", ".otf", ".pbm", ".pcx", ".pdf", ".pea", ".pgm", ".pic", ".png", ".pnm", ".ppm", ".psd", ".pya", ".pyc",
-    ".pyo", ".pyv", ".qt", ".rar", ".ras", ".raw", ".rgb", ".rip", ".rlc", ".rz", ".s3m", ".s7z", ".scpt", ".sgi", ".shar", ".sil",
-    ".smv", ".so", ".sub", ".swf", ".tar", ".tbz2", ".tga", ".tgz", ".tif", ".tiff", ".tlz", ".ts", ".ttf", ".uvh", ".uvi", ".uvm",
-    ".uvp", ".uvs", ".uvu", ".viv", ".vob", ".war", ".wav", ".wax", ".wbmp", ".wdp", ".weba", ".webm", ".webp", ".whl", ".wm", ".wma",
-    ".wmv", ".wmx", ".woff", ".woff2", ".wvx", ".xbm", ".xif", ".xm", ".xpi", ".xpm", ".xwd", ".xz", ".z", ".zip", ".zipx"
+    ".3ds", ".3g2", ".3gp", ".7z", ".a", ".aac", ".adp", ".ai", ".aif", ".apk", ".ar", ".asf", ".au", ".avi", ".bak",
+    ".bin", ".bk", ".bmp", ".btif", ".bz2", ".cab", ".caf", ".cgm", ".cmx", ".cpio", ".cr2", ".dat", ".deb", ".djvu",
+    ".dll", ".dmg", ".dng", ".doc", ".docx", ".dra", ".DS_Store", ".dsk", ".dts", ".dtshd", ".dvb", ".dwg", ".dxf",
+    ".ecelp4800", ".ecelp7470", ".ecelp9600", ".egg", ".eol", ".eot", ".epub", ".exe", ".f4v", ".fbs", ".fh", ".fla",
+    ".flac", ".fli", ".flv", ".fpx", ".fst", ".fvt", ".g3", ".gif", ".gz", ".h261", ".h263", ".h264", ".ico", ".ief",
+    ".img", ".ipa", ".iso", ".jar", ".jpeg", ".jpg", ".jpgv", ".jpm", ".jxr", ".ktx", ".lvp", ".lz", ".lzma", ".lzo",
+    ".m3u", ".m4a", ".m4v", ".mar", ".mdi", ".mid", ".mj2", ".mka", ".mkv", ".mmr", ".mng", ".mov", ".movie", ".mp3",
+    ".mp4", ".mp4a", ".mpeg", ".mpg", ".mpga", ".mxu", ".nef", ".npx", ".o", ".oga", ".ogg", ".ogv", ".otf", ".pbm",
+    ".pcx", ".pdf", ".pea", ".pgm", ".pic", ".png", ".pnm", ".ppm", ".psd", ".pya", ".pyc", ".pyo", ".pyv", ".qt",
+    ".rar", ".ras", ".raw", ".rgb", ".rip", ".rlc", ".rz", ".s3m", ".s7z", ".scpt", ".sgi", ".shar", ".sil", ".smv",
+    ".so", ".sub", ".swf", ".tar", ".tbz2", ".tga", ".tgz", ".tif", ".tiff", ".tlz", ".ts", ".ttf", ".uvh", ".uvi",
+    ".uvm", ".uvp", ".uvs", ".uvu", ".viv", ".vob", ".war", ".wav", ".wax", ".wbmp", ".wdp", ".weba", ".webm", ".webp",
+    ".whl", ".wm", ".wma", ".wmv", ".wmx", ".woff", ".woff2", ".wvx", ".xbm", ".xif", ".xm", ".xpi", ".xpm", ".xwd",
+    ".xz", ".z", ".zip", ".zipx"
 ])
 
 PYPELINE_EXTENSIONS = frozenset(utils.MARKDOWN_EXTENSIONS + ['.rst'])
@@ -895,7 +897,7 @@ class MergeRequest(VersionedArtifact, ActivityObject):
             'state': {'$in': ['busy', 'complete', 'error', 'ready']},  # needed to use index
             'task_name': 'allura.tasks.repo_tasks.merge',
             'args': [self._id],
-            'time_queue': {'$gt': datetime.utcnow() - timedelta(days=1)}, # constrain on index further
+            'time_queue': {'$gt': datetime.utcnow() - timedelta(days=1)},  # constrain on index further
         }).sort('_id', -1).limit(1).first()
         if task:
             return task.state
@@ -906,7 +908,7 @@ class MergeRequest(VersionedArtifact, ActivityObject):
             'state': {'$in': ['busy', 'complete', 'error', 'ready']},  # needed to use index
             'task_name': 'allura.tasks.repo_tasks.can_merge',
             'args': [self._id],
-            'time_queue': {'$gt': datetime.utcnow() - timedelta(days=1)}, # constrain on index further
+            'time_queue': {'$gt': datetime.utcnow() - timedelta(days=1)},  # constrain on index further
         }).sort('_id', -1).limit(1).first()
         if task:
             return task.state

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/functional/test_auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index 388be1a..5ad86ea 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -1063,7 +1063,7 @@ class TestPreferences(TestController):
                               weekday=weekday2,
                               starttime=starttime2.strftime('%H:%M'),
                               endtime=endtime2.strftime('%H:%M'),
-                            _session_id=self.app.cookies['_session_id'],
+                              _session_id=self.app.cookies['_session_id'],
                           ))
         user = M.User.query.get(username='test-admin')
         timeslot2dict = dict(week_day=weekday2,
@@ -1159,14 +1159,14 @@ class TestPreferences(TestController):
         skill_cat = M.TroveCategory.query.get(show_as_skill=True)
         level = 'low'
         comment = 'test comment'
-        result = self.app.get('/auth/user_info/skills/')
-        r = self.app.post('/auth/user_info/skills/save_skill',
-                          params=dict(
-                              level=level,
-                              comment=comment,
-                              selected_skill=str(skill_cat.trove_cat_id),
-                              _session_id=self.app.cookies['_session_id'],
-                          ))
+        self.app.get('/auth/user_info/skills/')
+        self.app.post('/auth/user_info/skills/save_skill',
+                      params=dict(
+                          level=level,
+                          comment=comment,
+                          selected_skill=str(skill_cat.trove_cat_id),
+                          _session_id=self.app.cookies['_session_id'],
+                      ))
         user = M.User.query.get(username='test-admin')
         skilldict = dict(category_id=skill_cat._id,
                          comment=comment, level=level)
@@ -1175,14 +1175,14 @@ class TestPreferences(TestController):
         # Add again the same skill
         level = 'medium'
         comment = 'test comment 2'
-        result = self.app.get('/auth/user_info/skills/')
-        r = self.app.post('/auth/user_info/skills/save_skill',
-                          params=dict(
-                              level=level,
-                              comment=comment,
-                              selected_skill=str(skill_cat.trove_cat_id),
-                              _session_id=self.app.cookies['_session_id'],
-                          ))
+        self.app.get('/auth/user_info/skills/')
+        self.app.post('/auth/user_info/skills/save_skill',
+                      params=dict(
+                          level=level,
+                          comment=comment,
+                          selected_skill=str(skill_cat.trove_cat_id),
+                          _session_id=self.app.cookies['_session_id'],
+                      ))
         user = M.User.query.get(username='test-admin')
         skilldict = dict(category_id=skill_cat._id,
                          comment=comment, level=level)
@@ -1191,13 +1191,13 @@ class TestPreferences(TestController):
         # Add an invalid skill
         level2 = 'not a level'
         comment2 = 'test comment 2'
-        r = self.app.post('/auth/user_info/skills/save_skill',
-                          params=dict(
-                              level=level2,
-                              comment=comment2,
-                              selected_skill=str(skill_cat.trove_cat_id),
-                              _session_id=self.app.cookies['_session_id'],
-                          ))
+        self.app.post('/auth/user_info/skills/save_skill',
+                      params=dict(
+                          level=level2,
+                          comment=comment2,
+                          selected_skill=str(skill_cat.trove_cat_id),
+                          _session_id=self.app.cookies['_session_id'],
+                      ))
         user = M.User.query.get(username='test-admin')
         # Check that everything is as it was before
         assert len(user.skills) == 1 and skilldict in user.skills
@@ -1450,13 +1450,13 @@ class TestOAuth(TestController):
     def test_interactive(self, Request, Server):
         M.OAuthConsumerToken.consumer = mock.Mock()
         user = M.User.by_username('test-admin')
-        consumer_token = M.OAuthConsumerToken(
+        M.OAuthConsumerToken(
             api_key='api_key',
             user_id=user._id,
             description='ctok_desc',
         )
         ThreadLocalORMSession.flush_all()
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_callback': 'http://my.domain.com/callback',
         }
@@ -1467,7 +1467,7 @@ class TestOAuth(TestController):
         r = r.forms[0].submit('yes')
         assert r.location.startswith('http://my.domain.com/callback')
         pin = parse_qs(urlparse(r.location).query)['oauth_verifier'][0]
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_token': rtok,
             'oauth_verifier': pin,
@@ -1502,10 +1502,10 @@ class TestOAuth(TestController):
     @mock.patch('allura.controllers.rest.oauth.Server')
     @mock.patch('allura.controllers.rest.oauth.Request')
     def test_request_token_no_consumer_token(self, Request, Server):
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key'}
-        r = self.app.post('/rest/oauth/request_token',
-                          params={'key': 'value'}, status=403)
+        self.app.post('/rest/oauth/request_token',
+                      params={'key': 'value'}, status=403)
 
     @mock.patch('allura.controllers.rest.oauth.Server')
     @mock.patch('allura.controllers.rest.oauth.Request')
@@ -1513,12 +1513,12 @@ class TestOAuth(TestController):
         Server().verify_request.side_effect = ValueError
         M.OAuthConsumerToken.consumer = mock.Mock()
         user = M.User.by_username('test-user')
-        consumer_token = M.OAuthConsumerToken(
+        M.OAuthConsumerToken(
             api_key='api_key',
             user_id=user._id,
         )
         ThreadLocalORMSession.flush_all()
-        req = Request.from_request.return_value = {'oauth_consumer_key': 'api_key'}
+        Request.from_request.return_value = {'oauth_consumer_key': 'api_key'}
         self.app.post('/rest/oauth/request_token', params={'key': 'value'}, status=403)
 
     def test_authorize_ok(self):
@@ -1528,7 +1528,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='oob',
@@ -1549,7 +1549,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='oob',
@@ -1567,7 +1567,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='oob',
@@ -1584,7 +1584,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='http://my.domain.com/callback',
@@ -1601,7 +1601,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='http://my.domain.com/callback?myparam=foo',
@@ -1613,7 +1613,7 @@ class TestOAuth(TestController):
 
     @mock.patch('allura.controllers.rest.oauth.Request')
     def test_access_token_no_consumer(self, Request):
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_token': 'api_key',
             'oauth_verifier': 'good',
@@ -1622,13 +1622,13 @@ class TestOAuth(TestController):
 
     @mock.patch('allura.controllers.rest.oauth.Request')
     def test_access_token_no_request(self, Request):
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_token': 'api_key',
             'oauth_verifier': 'good',
         }
         user = M.User.by_username('test-admin')
-        ctok = M.OAuthConsumerToken(
+        M.OAuthConsumerToken(
             api_key='api_key',
             user_id=user._id,
             description='ctok_desc',
@@ -1638,7 +1638,7 @@ class TestOAuth(TestController):
 
     @mock.patch('allura.controllers.rest.oauth.Request')
     def test_access_token_bad_pin(self, Request):
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_token': 'api_key',
             'oauth_verifier': 'bad',
@@ -1649,7 +1649,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='http://my.domain.com/callback?myparam=foo',
@@ -1662,7 +1662,7 @@ class TestOAuth(TestController):
     @mock.patch('allura.controllers.rest.oauth.Server')
     @mock.patch('allura.controllers.rest.oauth.Request')
     def test_access_token_bad_sig(self, Request, Server):
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_token': 'api_key',
             'oauth_verifier': 'good',
@@ -1673,7 +1673,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='http://my.domain.com/callback?myparam=foo',
@@ -1687,7 +1687,7 @@ class TestOAuth(TestController):
     @mock.patch('allura.controllers.rest.oauth.Server')
     @mock.patch('allura.controllers.rest.oauth.Request')
     def test_access_token_ok(self, Request, Server):
-        req = Request.from_request.return_value = {
+        Request.from_request.return_value = {
             'oauth_consumer_key': 'api_key',
             'oauth_token': 'api_key',
             'oauth_verifier': 'good',
@@ -1698,7 +1698,7 @@ class TestOAuth(TestController):
             user_id=user._id,
             description='ctok_desc',
         )
-        rtok = M.OAuthRequestToken(
+        M.OAuthRequestToken(
             api_key='api_key',
             consumer_token_id=ctok._id,
             callback='http://my.domain.com/callback?myparam=foo',
@@ -1735,8 +1735,8 @@ class TestDisableAccount(TestController):
 
     def test_bad_password(self):
         self.app.get('/')  # establish session
-        r = self.app.post('/auth/disable/do_disable',{'password': 'bad',
-                                                      '_session_id': self.app.cookies['_session_id'],})
+        r = self.app.post('/auth/disable/do_disable', {'password': 'bad',
+                                                       '_session_id': self.app.cookies['_session_id'], })
         assert_in('Invalid password', r)
         user = M.User.by_username('test-admin')
         assert_equal(user.disabled, False)
@@ -1744,7 +1744,7 @@ class TestDisableAccount(TestController):
     def test_disable(self):
         self.app.get('/')  # establish session
         r = self.app.post('/auth/disable/do_disable', {'password': 'foo',
-                                                       '_session_id': self.app.cookies['_session_id'],})
+                                                       '_session_id': self.app.cookies['_session_id'], })
         assert_equal(r.status_int, 302)
         assert_equal(r.location, 'http://localhost/')
         flash = json.loads(self.webflash(r))
@@ -1866,8 +1866,8 @@ class TestPasswordExpire(TestController):
             self.assert_redirects()
             user = M.User.by_username('test-user')
             user.set_tool_data('AuthPasswordReset',
-                          hash="generated_hash_value",
-                          hash_expiry="04-08-2020")
+                               hash="generated_hash_value",
+                               hash_expiry="04-08-2020")
             hash = user.get_tool_data('AuthPasswordReset', 'hash')
             hash_expiry = user.get_tool_data('AuthPasswordReset', 'hash_expiry')
             assert_equal(hash, 'generated_hash_value')
@@ -1890,7 +1890,6 @@ class TestPasswordExpire(TestController):
             assert_equal(hash, '')
             assert_equal(hash_expiry, '')
 
-
     def check_validation(self, oldpw, pw, pw2):
         user = M.User.by_username('test-user')
         old_update_time = user.last_password_updated
@@ -1950,7 +1949,6 @@ class TestPasswordExpire(TestController):
 
 
 class TestCSRFProtection(TestController):
-
     def test_blocks_invalid(self):
         # so test-admin isn't automatically logged in for all requests
         self.app.extra_environ = {'disable_auth_magic': 'True'}
@@ -1980,4 +1978,3 @@ class TestCSRFProtection(TestController):
     def test_token_present_on_first_request(self):
         r = self.app.get('/auth/')
         assert_true(r.form['_session_id'].value)
-

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/functional/test_discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_discuss.py b/Allura/allura/tests/functional/test_discuss.py
index 0063cb8..6f8b8a7 100644
--- a/Allura/allura/tests/functional/test_discuss.py
+++ b/Allura/allura/tests/functional/test_discuss.py
@@ -66,9 +66,8 @@ class TestDiscuss(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = text
         r = self.app.post(f['action'].encode('utf-8'), params=params,
                           headers={'Referer': thread_link.encode("utf-8")},
@@ -91,9 +90,8 @@ class TestDiscuss(TestController):
         params = dict()
         inputs = post_form.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[post_form.find('textarea')['name']] = 'This is a new post'
         r = self.app.post(post_link,
                           params=params,
@@ -106,9 +104,8 @@ class TestDiscuss(TestController):
         params = dict()
         inputs = post_form.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[post_form.find('textarea')['name']] = 'Tis a reply'
         r = self.app.post(post_link + 'reply',
                           params=params,
@@ -218,9 +215,8 @@ class TestDiscuss(TestController):
         params = dict()
         inputs = reply_form.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[reply_form.find('textarea')['name']] = 'zzz'
         self.app.post(post_link, params)
         assert create_activity.call_count == 1, create_activity.call_count
@@ -259,9 +255,8 @@ class TestAttachment(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'Test Post'
         r = self.app.post(f['action'].encode('utf-8'), params=params,
                           headers={'Referer': self.thread_link})
@@ -299,9 +294,8 @@ class TestAttachment(TestController):
         inputs = post_form.findAll('input')
 
         for field in inputs:
-            if field.has_key('name') and (field['name'] != 'file_info'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name') and field['name'] != 'file_info':  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[post_form.find('textarea')['name']] = 'Reply'
         r = self.app.post(self.post_link + 'reply',
                           params=params,

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/functional/test_neighborhood.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_neighborhood.py b/Allura/allura/tests/functional/test_neighborhood.py
index 8b6a74f..825b9c5 100644
--- a/Allura/allura/tests/functional/test_neighborhood.py
+++ b/Allura/allura/tests/functional/test_neighborhood.py
@@ -37,7 +37,6 @@ from alluratest.controller import setup_trove_categories
 
 
 class TestNeighborhood(TestController):
-
     def test_home_project(self):
         r = self.app.get('/adobe/wiki/')
         assert r.location.endswith('/adobe/wiki/Home/')
@@ -119,9 +118,9 @@ class TestNeighborhood(TestController):
 
     def test_prohibited_tools(self):
         self.app.post('/p/_admin/update',
-                          params=dict(name='Projects',
-                          prohibited_tools='wiki, tickets'),
-                          extra_environ=dict(username='root'))
+                      params=dict(name='Projects',
+                                  prohibited_tools='wiki, tickets'),
+                      extra_environ=dict(username='root'))
 
         r = self.app.get('/p/_admin/overview', extra_environ=dict(username='root'))
         assert 'wiki, tickets' in r
@@ -132,7 +131,7 @@ class TestNeighborhood(TestController):
 
         r = self.app.post('/p/_admin/update',
                           params=dict(name='Projects',
-                          prohibited_tools='wiki, test'),
+                                      prohibited_tools='wiki, test'),
                           extra_environ=dict(username='root'))
         assert 'error' in self.webflash(r), self.webflash(r)
 
@@ -360,8 +359,8 @@ class TestNeighborhood(TestController):
         assert '/*projecttitlecolor*/.project_title{color:green;}' in neighborhood.css
         assert '/*barontop*/.pad h2.colored {background-color:#555555; background-image: none;}' in neighborhood.css
         assert '/*titlebarbackground*/.pad h2.title{background-color:#333; background-image: none;}' in neighborhood.css
-        assert "/*titlebarcolor*/.pad h2.title, .pad h2.title small a {color:#444;} "\
-               ".pad h2.dark small b.ico {background-image: "\
+        assert "/*titlebarcolor*/.pad h2.title, .pad h2.title small a {color:#444;} " \
+               ".pad h2.dark small b.ico {background-image: " \
                "url('/nf/_ew_/theme/allura/images/neo-icon-set-ffffff-256x350.png');}" in neighborhood.css
 
     def test_max_projects(self):
@@ -646,8 +645,8 @@ class TestNeighborhood(TestController):
     def test_project_template(self):
         setup_trove_categories()
         icon_url = 'file://' + \
-            os.path.join(allura.__path__[0], 'nf', 'allura',
-                         'images', 'neo-icon-set-454545-256x350.png')
+                   os.path.join(allura.__path__[0], 'nf', 'allura',
+                                'images', 'neo-icon-set-454545-256x350.png')
         test_groups = [{
             "name": "Viewer",  # group will be created, all params are valid
             "permissions": ["read"],
@@ -669,7 +668,9 @@ class TestNeighborhood(TestController):
             "permissions": ["admin"]
         }]
         r = self.app.post('/adobe/_admin/update', params=dict(name='Mozq1',
-                                                              css='', homepage='# MozQ1!\n[Root]', project_template="""{
+                                                              css='',
+                                                              homepage='# MozQ1!\n[Root]',
+                                                              project_template="""{
                 "private":true,
                 "icon":{
                     "url":"%s",
@@ -716,22 +717,14 @@ class TestNeighborhood(TestController):
         p = M.Project.query.get(shortname='testtemp')
         # make sure the correct tools got installed in the right order
         top_nav = r.html.find('div', {'id': 'top_nav'})
-        assert top_nav.contents[1].contents[1].contents[
-            1]['href'] == '/adobe/testtemp/wiki/'
-        assert 'Wiki' in top_nav.contents[
-            1].contents[1].contents[1].contents[0]
-        assert top_nav.contents[1].contents[3].contents[
-            1]['href'] == '/adobe/testtemp/discussion/'
-        assert 'Discussion' in top_nav.contents[
-            1].contents[3].contents[1].contents[0]
-        assert top_nav.contents[1].contents[5].contents[
-            1]['href'] == '/adobe/testtemp/news/'
-        assert 'News' in top_nav.contents[
-            1].contents[5].contents[1].contents[0]
-        assert top_nav.contents[1].contents[7].contents[
-            1]['href'] == '/adobe/testtemp/admin/'
-        assert 'Admin' in top_nav.contents[
-            1].contents[7].contents[1].contents[0]
+        assert top_nav.contents[1].contents[1].contents[1]['href'] == '/adobe/testtemp/wiki/'
+        assert 'Wiki' in top_nav.contents[1].contents[1].contents[1].contents[0]
+        assert top_nav.contents[1].contents[3].contents[1]['href'] == '/adobe/testtemp/discussion/'
+        assert 'Discussion' in top_nav.contents[1].contents[3].contents[1].contents[0]
+        assert top_nav.contents[1].contents[5].contents[1]['href'] == '/adobe/testtemp/news/'
+        assert 'News' in top_nav.contents[1].contents[5].contents[1].contents[0]
+        assert top_nav.contents[1].contents[7].contents[1]['href'] == '/adobe/testtemp/admin/'
+        assert 'Admin' in top_nav.contents[1].contents[7].contents[1].contents[0]
         # make sure project is private
         r = self.app.get(
             '/adobe/testtemp/wiki/',
@@ -803,7 +796,7 @@ class TestNeighborhood(TestController):
                 },
                 "tool_order":["wiki","admin"],
 
-                }""" ),
+                }"""),
                           extra_environ=dict(username='root'))
         neighborhood = M.Neighborhood.query.get(name='Adobe')
         neighborhood.anchored_tools = 'wiki:Wiki'
@@ -834,7 +827,8 @@ class TestNeighborhood(TestController):
             r = self.app.get(
                 '/p/check_names?neighborhood=Projects&project_unixname=%s' % name)
             assert_equal(
-                r.json, {'project_unixname': 'Please use only small letters, numbers, and dashes 3-15 characters long.'})
+                r.json,
+                {'project_unixname': 'Please use only small letters, numbers, and dashes 3-15 characters long.'})
         r = self.app.get(
             '/p/check_names?neighborhood=Projects&project_unixname=mymoz')
         assert_equal(r.json, {})
@@ -894,8 +888,8 @@ class TestNeighborhood(TestController):
         image = PIL.Image.open(StringIO(r.body))
         assert image.size == (48, 48)
         self.app.post('/adobe/_admin/awards/grant',
-                params=dict(grant='FOO', recipient='adobe-1',
-                            url='http://award.org', comment='Winner!'),
+                      params=dict(grant='FOO', recipient='adobe-1',
+                                  url='http://award.org', comment='Winner!'),
                       extra_environ=dict(username='root'))
         r = self.app.get('/adobe/_admin/accolades',
                          extra_environ=dict(username='root'))
@@ -959,7 +953,6 @@ class TestNeighborhood(TestController):
 
 
 class TestPhoneVerificationOnProjectRegistration(TestController):
-
     def test_phone_verification_fragment_renders(self):
         self.app.get('/p/phone_verification_fragment', status=200)
         self.app.get('/adobe/phone_verification_fragment', status=200)

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_rest.py b/Allura/allura/tests/functional/test_rest.py
index 903cda7..1a2006d 100644
--- a/Allura/allura/tests/functional/test_rest.py
+++ b/Allura/allura/tests/functional/test_rest.py
@@ -249,9 +249,9 @@ class TestRestHome(TestRestApiBase):
         assert_equal(r.json['result'], False)
 
     def test_project_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/has_access', status=404)
-        r = self.api_get('/rest/p/test/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/has_access', status=404)
+        self.api_get('/rest/p/test/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/has_access?perm=read', status=404)
 
     def test_project_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/functional/test_user_profile.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_user_profile.py b/Allura/allura/tests/functional/test_user_profile.py
index 4425ace..14c28bf 100644
--- a/Allura/allura/tests/functional/test_user_profile.py
+++ b/Allura/allura/tests/functional/test_user_profile.py
@@ -194,9 +194,9 @@ class TestUserProfileHasAccessAPI(TestRestApiBase):
 
     @td.with_user_project('test-admin')
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/u/test-admin/profile/has_access', status=404)
-        r = self.api_get('/rest/u/test-admin/profile/has_access?user=root', status=404)
-        r = self.api_get('/rest/u/test-admin/profile/has_access?perm=read', status=404)
+        self.api_get('/rest/u/test-admin/profile/has_access', status=404)
+        self.api_get('/rest/u/test-admin/profile/has_access?user=root', status=404)
+        self.api_get('/rest/u/test-admin/profile/has_access?perm=read', status=404)
 
     @td.with_user_project('test-admin')
     def test_has_access_unknown_params(self):

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/test_globals.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_globals.py b/Allura/allura/tests/test_globals.py
index 0203969..bb5d80e 100644
--- a/Allura/allura/tests/test_globals.py
+++ b/Allura/allura/tests/test_globals.py
@@ -48,6 +48,7 @@ from allura.tests import decorators as td
 from forgewiki import model as WM
 from forgeblog import model as BM
 
+
 def squish_spaces(text):
     return re.sub(r'\s+', ' ', text)
 
@@ -171,7 +172,9 @@ def test_macro_gittip_button():
     with h.push_config(c, project=p_test):
         r = g.markdown_wiki.convert('[[gittip_button username=test]]')
     assert_equal(
-        r, u'<div class="markdown_content"><p><iframe height="22pt" src="https://www.gittip.com/test/widget.html" style="border: 0; margin: 0; padding: 0;" width="48pt"></iframe>\n</p></div>')
+        r,
+        u'<div class="markdown_content"><p><iframe height="22pt" src="https://www.gittip.com/test/widget.html" '
+        u'style="border: 0; margin: 0; padding: 0;" width="48pt"></iframe>\n</p></div>')
 
 
 def test_macro_neighborhood_feeds():
@@ -213,7 +216,7 @@ def test_macro_members():
     p_test.add_user(M.User.by_username('test-user'), ['Developer'])
     p_test.add_user(M.User.by_username('test-user-0'), ['Member'])
     ThreadLocalORMSession.flush_all()
-    r = g.markdown_wiki.convert('[[members limit=2]]').replace('\t','').replace('\n','')
+    r = g.markdown_wiki.convert('[[members limit=2]]').replace('\t', '').replace('\n', '')
     assert_equal(r,
                  '<div class="markdown_content"><h6>Project Members:</h6>'
                  '<ul class="md-users-list">'
@@ -258,7 +261,7 @@ def test_macro_project_admins_one_br():
     with h.push_config(c, project=p_test):
         r = g.markdown_wiki.convert('[[project_admins]]\n[[download_button]]')
 
-    assert not '</a><br/><br/><a href=' in r, r
+    assert '</a><br/><br/><a href=' not in r, r
     assert '</a></li><li><a href=' in r, r
 
 
@@ -293,6 +296,7 @@ def test_macro_include_no_extra_br():
 <p></p></div>'''
     assert_equal(squish_spaces(html), squish_spaces(expected_html))
 
+
 @with_setup(setUp, tearDown)
 @td.with_wiki
 @td.with_tool('test', 'Wiki', 'wiki2')
@@ -330,11 +334,13 @@ def test_macro_include_permissions():
 @patch('oembed.OEmbedEndpoint.fetch')
 def test_macro_embed(oembed_fetch):
     oembed_fetch.return_value = {
-        "html": '<iframe width="480" height="270" src="http://www.youtube.com/embed/kOLpSPEA72U?feature=oembed" frameborder="0" allowfullscreen></iframe>)',
+        "html": '<iframe width="480" height="270" src="http://www.youtube.com/embed/kOLpSPEA72U?feature=oembed" '
+                'frameborder="0" allowfullscreen></iframe>)',
         "title": "Nature's 3D Printer: MIND BLOWING Cocoon in Rainforest - Smarter Every Day 94",
     }
     r = g.markdown_wiki.convert('[[embed url=http://www.youtube.com/watch?v=kOLpSPEA72U]]')
-    assert_in('<div class="grid-20"><iframe height="270" src="https://www.youtube.com/embed/kOLpSPEA72U?feature=oembed" width="480"></iframe></div>',
+    assert_in('<div class="grid-20"><iframe height="270" '
+              'src="https://www.youtube.com/embed/kOLpSPEA72U?feature=oembed" width="480"></iframe></div>',
               r.replace('\n', ''))
 
 
@@ -484,13 +490,20 @@ def test_markdown_invalid_tagslash():
     r = g.markdown.convert('<div/onload><img src=x onerror=alert(document.cookie)>')
     assert_not_in('onerror', r)
 
+
 def test_markdown_invalid_script_in_link():
     r = g.markdown.convert('[xss](http://"><a onmouseover=prompt(document.domain)>xss</a>)')
-    assert_equal('''<div class="markdown_content"><p><a class="" href='http://"&gt;&lt;a%20onmouseover=prompt(document.domain)&gt;xss&lt;/a&gt;' rel="nofollow">xss</a></p></div>''', r)
+    assert_equal('<div class="markdown_content"><p><a class="" '
+                 '''href='http://"&gt;&lt;a%20onmouseover=prompt(document.domain)&gt;xss&lt;/a&gt;' '''
+                 'rel="nofollow">xss</a></p></div>', r)
+
 
 def test_markdown_invalid_script_in_link2():
     r = g.markdown.convert('[xss](http://"><img src=x onerror=alert(document.cookie)>)')
-    assert_equal('''<div class="markdown_content"><p><a class="" href='http://"&gt;&lt;img%20src=x%20onerror=alert(document.cookie)&gt;' rel="nofollow">xss</a></p></div>''', r)
+    assert_equal('<div class="markdown_content"><p><a class="" '
+                 '''href='http://"&gt;&lt;img%20src=x%20onerror=alert(document.cookie)&gt;' '''
+                 'rel="nofollow">xss</a></p></div>', r)
+
 
 @td.with_wiki
 def test_macro_include():
@@ -629,7 +642,8 @@ def test_hideawards_macro():
 
     with h.push_context(p_nbhd.neighborhood_project._id):
         r = g.markdown_wiki.convert('[[projects]]')
-        assert_in('<div class="feature"> <a href="http://award.org" rel="nofollow" title="Winner!">Award short</a> </div>',
+        assert_in('<div class="feature"> <a href="http://award.org" rel="nofollow" title="Winner!">'
+                  'Award short</a> </div>',
                   squish_spaces(r))
 
         r = g.markdown_wiki.convert('[[projects show_awards_banner=False]]')
@@ -642,7 +656,7 @@ def get_project_names(r):
     """
     # projects short names are in h2 elements without any attributes
     # there is one more h2 element, but it has `class` attribute
-    #re_proj_names = re.compile('<h2><a[^>]>(.+)<\/a><\/h2>')
+    # re_proj_names = re.compile('<h2><a[^>]>(.+)<\/a><\/h2>')
     re_proj_names = re.compile('<h2><a[^>]+>(.+)<\/a><\/h2>')
     return [e for e in re_proj_names.findall(r)]
 
@@ -754,8 +768,10 @@ class TestHandlePaging(unittest.TestCase):
     def setUp(self):
         prefs = {}
         c.user = Mock()
+
         def get_pref(name):
             return prefs.get(name)
+
         def set_pref(name, value):
             prefs[name] = value
         c.user.get_pref = get_pref

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/tests/test_utils.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_utils.py b/Allura/allura/tests/test_utils.py
index dd67ded..413165a 100644
--- a/Allura/allura/tests/test_utils.py
+++ b/Allura/allura/tests/test_utils.py
@@ -22,7 +22,6 @@ import time
 import unittest
 import datetime as dt
 from ming.odm import session
-import model as M
 from os import path
 
 from webob import Request
@@ -169,12 +168,12 @@ class TestTruthyCallable(unittest.TestCase):
             return utils.TruthyCallable(predicate)
         true_predicate = wrapper_func(True)
         false_predicate = wrapper_func(False)
-        assert true_predicate(True) == True
-        assert false_predicate(False) == False
-        assert true_predicate() == True
-        assert false_predicate() == False
-        assert bool(true_predicate) == True
-        assert bool(false_predicate) == False
+        assert true_predicate(True) is True
+        assert false_predicate(False) is False
+        assert true_predicate() is True
+        assert false_predicate() is False
+        assert bool(true_predicate) is True
+        assert bool(false_predicate) is False
 
 
 class TestCaseInsensitiveDict(unittest.TestCase):
@@ -260,7 +259,8 @@ class TestHTMLSanitizer(unittest.TestCase):
         assert_equal(self.simple_tag_list(p), ['div', 'div'])
 
     def test_html_sanitizer_youtube_iframe(self):
-        p = utils.ForgeHTMLSanitizer('<div><iframe src="https://www.youtube.com/embed/kOLpSPEA72U?feature=oembed"></iframe></div>')
+        p = utils.ForgeHTMLSanitizer(
+            '<div><iframe src="https://www.youtube.com/embed/kOLpSPEA72U?feature=oembed"></iframe></div>')
         assert_equal(
             self.simple_tag_list(p), ['div', 'iframe', 'div'])
 
@@ -272,6 +272,7 @@ def test_ip_address():
     assert_equal(utils.ip_address(req),
                  '1.2.3.4')
 
+
 def test_ip_address_header():
     req = Mock()
     req.remote_addr = '1.2.3.4'
@@ -280,6 +281,7 @@ def test_ip_address_header():
         assert_equal(utils.ip_address(req),
                      '5.6.7.8')
 
+
 def test_ip_address_header_not_set():
     req = Mock()
     req.remote_addr = '1.2.3.4'
@@ -329,5 +331,5 @@ def test_phone_number_hash():
 
 def test_skip_mod_date():
     with utils.skip_mod_date(M.Artifact):
-        assert getattr(session(M.Artifact)._get(), 'skip_mod_date', None) == True
-    assert getattr(session(M.Artifact)._get(), 'skip_mod_date', None) == False
\ No newline at end of file
+        assert getattr(session(M.Artifact)._get(), 'skip_mod_date', None) is True
+    assert getattr(session(M.Artifact)._get(), 'skip_mod_date', None) is False

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/allura/websetup/bootstrap.py
----------------------------------------------------------------------
diff --git a/Allura/allura/websetup/bootstrap.py b/Allura/allura/websetup/bootstrap.py
index 33a3f3c..8bc04fe 100644
--- a/Allura/allura/websetup/bootstrap.py
+++ b/Allura/allura/websetup/bootstrap.py
@@ -22,7 +22,6 @@ import os
 import sys
 import logging
 import shutil
-from collections import defaultdict
 from textwrap import dedent
 
 import tg
@@ -110,7 +109,7 @@ def bootstrap(command, conf, vars):
     log.info('Initializing search')
 
     log.info('Registering root user & default neighborhoods')
-    anonymous = M.User(
+    M.User(
         _id=None,
         username='*anonymous',
         display_name='Anonymous')
@@ -172,7 +171,8 @@ def bootstrap(command, conf, vars):
         [[projects show_total=yes]]
         '''))
     set_nbhd_wiki_content(p_users, dedent('''
-        This is the "Users" neighborhood.  All users automatically get a user-project created for them, using their username.
+        This is the "Users" neighborhood.
+        All users automatically get a user-project created for them, using their username.
 
         [Neighborhood administration](/u/admin)
 
@@ -208,19 +208,19 @@ def bootstrap(command, conf, vars):
             make_user('Test User %d' % unum)
 
     log.info('Creating basic project categories')
-    cat1 = M.ProjectCategory(name='clustering', label='Clustering')
+    M.ProjectCategory(name='clustering', label='Clustering')
     cat2 = M.ProjectCategory(name='communications', label='Communications')
-    cat2_1 = M.ProjectCategory(
+    M.ProjectCategory(
         name='synchronization', label='Synchronization', parent_id=cat2._id)
-    cat2_2 = M.ProjectCategory(
+    M.ProjectCategory(
         name='streaming', label='Streaming', parent_id=cat2._id)
-    cat2_3 = M.ProjectCategory(name='fax', label='Fax', parent_id=cat2._id)
-    cat2_4 = M.ProjectCategory(name='bbs', label='BBS', parent_id=cat2._id)
+    M.ProjectCategory(name='fax', label='Fax', parent_id=cat2._id)
+    M.ProjectCategory(name='bbs', label='BBS', parent_id=cat2._id)
 
     cat3 = M.ProjectCategory(name='database', label='Database')
-    cat3_1 = M.ProjectCategory(
+    M.ProjectCategory(
         name='front_ends', label='Front-Ends', parent_id=cat3._id)
-    cat3_2 = M.ProjectCategory(
+    M.ProjectCategory(
         name='engines_servers', label='Engines/Servers', parent_id=cat3._id)
 
     if create_test_data:
@@ -244,12 +244,12 @@ def bootstrap(command, conf, vars):
             p_projects.add_user(u_admin, ['Admin'])
             p_users.add_user(u_admin, ['Admin'])
 
-            p_allura = n_projects.register_project('allura', u_admin, 'Allura')
-        u1 = make_user('Test User')
-        p_adobe1 = n_adobe.register_project('adobe-1', u_admin, 'Adobe project 1')
+            n_projects.register_project('allura', u_admin, 'Allura')
+        make_user('Test User')
+        n_adobe.register_project('adobe-1', u_admin, 'Adobe project 1')
         p_adobe.add_user(u_admin, ['Admin'])
         p0 = n_projects.register_project('test', u_admin, 'Test Project')
-        p1 = n_projects.register_project('test2', u_admin, 'Test 2')
+        n_projects.register_project('test2', u_admin, 'Test 2')
         p0._extra_tool_status = ['alpha', 'beta']
 
     sess = session(M.Neighborhood)  # all the sessions are the same
@@ -279,11 +279,11 @@ def bootstrap(command, conf, vars):
             log.info('Registering initial apps')
             with h.push_config(c, user=u_admin):
                 p0.install_apps([{'ep_name': ep_name}
-                    for ep_name, app in g.entry_points['tool'].iteritems()
-                    if app._installable(tool_name=ep_name,
-                                        nbhd=n_projects,
-                                        project_tools=[])
-                ])
+                                 for ep_name, app in g.entry_points['tool'].iteritems()
+                                 if app._installable(tool_name=ep_name,
+                                                     nbhd=n_projects,
+                                                     project_tools=[])
+                                 ])
 
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()


[2/3] allura git commit: [#7980] Fix many pep8 / pyflakes and related issues

Posted by br...@apache.org.
http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/Allura/setup.cfg
----------------------------------------------------------------------
diff --git a/Allura/setup.cfg b/Allura/setup.cfg
index a835b71..0298938 100644
--- a/Allura/setup.cfg
+++ b/Allura/setup.cfg
@@ -15,6 +15,12 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+[pep8]
+max-line-length = 119
+
+[flake8]
+max-line-length = 119
+
 [egg_info]
 tag_build = dev0
 

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeActivity/forgeactivity/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/tests/functional/test_rest.py b/ForgeActivity/forgeactivity/tests/functional/test_rest.py
index f85639a..8c9e0f5 100644
--- a/ForgeActivity/forgeactivity/tests/functional/test_rest.py
+++ b/ForgeActivity/forgeactivity/tests/functional/test_rest.py
@@ -33,9 +33,9 @@ class TestActivityHasAccessAPI(TestRestApiBase):
         config['activitystream.enabled'] = self._enabled
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/activity/has_access', status=404)
-        r = self.api_get('/rest/p/test/activity/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/activity/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/activity/has_access', status=404)
+        self.api_get('/rest/p/test/activity/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/activity/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeBlog/forgeblog/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/functional/test_rest.py b/ForgeBlog/forgeblog/tests/functional/test_rest.py
index 3df73da..e7a9d7b 100644
--- a/ForgeBlog/forgeblog/tests/functional/test_rest.py
+++ b/ForgeBlog/forgeblog/tests/functional/test_rest.py
@@ -214,9 +214,9 @@ class TestBlogApi(TestRestApiBase):
         assert_equal(r.json['page'], 2)
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/blog/has_access', status=404)
-        r = self.api_get('/rest/p/test/blog/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/blog/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/blog/has_access', status=404)
+        self.api_get('/rest/p/test/blog/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/blog/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py b/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
index caad619..c66d5f8 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
@@ -26,7 +26,7 @@ from email.mime.multipart import MIMEMultipart
 
 import pkg_resources
 from pylons import tmpl_context as c
-from nose.tools import assert_equal, assert_in, assert_not_in
+from nose.tools import assert_equal, assert_in, assert_not_in, assert_true, assert_false
 import feedparser
 
 from allura import model as M
@@ -147,9 +147,8 @@ class TestForumAsync(TestController):
         self.user = M.User.query.get(username='root')
 
     def test_has_access(self):
-        assert False == c.app.has_access(M.User.anonymous(), 'testforum')
-        assert True == c.app.has_access(
-            M.User.query.get(username='root'), 'testforum')
+        assert_false(c.app.has_access(M.User.anonymous(), 'testforum'))
+        assert_true(c.app.has_access(M.User.query.get(username='root'), 'testforum'))
 
     def test_post(self):
         self._post('testforum', 'Test Thread', 'Nothing here')
@@ -209,9 +208,8 @@ class TestForumAsync(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params['subject'] = 'New Subject'
         params['text'] = 'Asdf'
         r = self.app.post(url, params=params)
@@ -221,9 +219,8 @@ class TestForumAsync(TestController):
         params = dict()
         inputs = post_form.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[post_form.find('textarea')['name']] = 'text'
         r = self.app.post(url + 'reply', params=params)
         self._post('testforum', 'Test Reply', 'Nothing here, either',
@@ -317,7 +314,6 @@ class TestForum(TestController):
                 form[field.name] = 'Test_Description'
         return form
 
-
     def test_unicode_name(self):
         r = self.app.get('/admin/discussion/forums')
         form = r.forms[3]
@@ -375,9 +371,8 @@ class TestForum(TestController):
             params = dict()
             inputs = f.findAll('input')
             for field in inputs:
-                if field.has_key('name'):
-                    params[field['name']] = field.has_key(
-                        'value') and field['value'] or ''
+                if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                    params[field['name']] = field.get('value') or ''
             params[f.find('textarea')['name']] = '1st post in Zero Posts thread'
             params[f.find('select')['name']] = 'testforum'
             params[f.find('input', {'style': 'width: 90%'})['name']] = 'Test Zero Posts'
@@ -419,8 +414,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'This is a *test thread*'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'Test Thread'
@@ -443,8 +438,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'Post text'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = "this is <h2> o'clock"
@@ -477,8 +472,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'Post content'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'Test Thread'
@@ -503,8 +498,7 @@ class TestForum(TestController):
         assert 'Post content' in r
         r = self.app.get('/discussion/testforum/moderate/')
         post = FM.ForumPost.query.get(text='Post content')
-        link = '<a href="%s">[%s]</a>' % (post.thread.url()
-                                          + '?limit=25#' + post.slug, post.shorthand_id())
+        link = '<a href="%s">[%s]</a>' % (post.thread.url() + '?limit=25#' + post.slug, post.shorthand_id())
         assert link in r, link
 
     def test_thread(self):
@@ -514,8 +508,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'AAA'
@@ -528,8 +522,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'bbb'
         thread = self.app.post(str(rep_url), params=params)
         thread = self.app.get(url)
@@ -550,8 +544,8 @@ class TestForum(TestController):
         params = dict()
         inputs = reply_form.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[reply_form.find('textarea')['name']] = 'zzz'
         self.app.post(post_link, params)
         r = self.app.get(thread_url)
@@ -565,8 +559,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'Post text'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'Post subject'
@@ -579,8 +573,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name') and 'subscription' not in field['name']:
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         self.app.post(str(subscribe_url), params=params)
         self.app.post('/discussion/general/subscribe_to_forum', {'subscribe': True})
         f = thread.html.find('div', {'class': 'row reply_post_form'}).find('form')
@@ -588,8 +582,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'Reply 2'
         self.app.post(str(rep_url), params=params)
         assert M.Notification.query.find(
@@ -613,8 +607,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'AAAA'
@@ -666,8 +660,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'topic1'
@@ -680,8 +674,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'topic2'
@@ -731,8 +725,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'topic1'
@@ -746,8 +740,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'bbb'
         thread = self.app.post(str(rep_url), params=params)
         thread = self.app.get(url)
@@ -779,8 +773,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'AAA'
@@ -803,8 +797,8 @@ class TestForum(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'aaa'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'AAA'
@@ -847,7 +841,7 @@ class TestForum(TestController):
         timestamp_before = M.Project.query.get(shortname='test').last_updated
 
         # View the thread and make sure project last_updated is not updated
-        thread = self.app.get(url)
+        self.app.get(url)
         timestamp_after = M.Project.query.get(shortname='test').last_updated
         assert_equal(timestamp_before, timestamp_after)
 

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py b/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
index 4597017..3e7f0d4 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_forum_admin.py
@@ -188,9 +188,8 @@ class TestForumAdmin(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'secret text'
         params[f.find('select')['name']] = 'secret'
         params[f.find('input', {'style': 'width: 90%'})
@@ -243,9 +242,8 @@ class TestForumAdmin(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'post text'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'post topic'
@@ -269,9 +267,8 @@ class TestForumAdmin(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'post text'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'post topic'
@@ -299,9 +296,8 @@ class TestForumAdmin(TestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'post text'
         params[f.find('select')['name']] = 'testforum'
         params[f.find('input', {'style': 'width: 90%'})['name']] = 'post topic'
@@ -309,7 +305,8 @@ class TestForumAdmin(TestController):
         M.MonQTask.run_ready()
         email_tasks = M.MonQTask.query.find(
             dict(task_name='allura.tasks.mail_tasks.sendsimplemail')).all()
-        assert 'Sent from localhost because email@monitoring.com is subscribed to http://localhost/p/test/discussion/testforum/' in email_tasks[
+        assert 'Sent from localhost because email@monitoring.com is subscribed '\
+               'to http://localhost/p/test/discussion/testforum/' in email_tasks[
             0].kwargs['text'], email_tasks[0].kwargs['text']
         assert 'a project admin can change settings at http://localhost/p/test/admin/discussion/forums' in email_tasks[
             0].kwargs['text']

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
index c7624a4..bf677e9 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -55,9 +55,8 @@ class TestDiscussionApiBase(TestRestApiBase):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key(
-                    'value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = text
         params[f.find('select')['name']] = forum
         params[f.find('input', {'style': 'width: 90%'})['name']] = subject
@@ -250,9 +249,9 @@ class TestRootRestController(TestDiscussionApiBase):
         assert_equal(r.json['forums'][0]['shortname'], 'general')
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/discussion/has_access', status=404)
-        r = self.api_get('/rest/p/test/discussion/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/discussion/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/discussion/has_access', status=404)
+        self.api_get('/rest/p/test/discussion/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/discussion/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeDiscussion/forgediscussion/widgets/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/widgets/__init__.py b/ForgeDiscussion/forgediscussion/widgets/__init__.py
index f733ddb..53322a7 100644
--- a/ForgeDiscussion/forgediscussion/widgets/__init__.py
+++ b/ForgeDiscussion/forgediscussion/widgets/__init__.py
@@ -18,3 +18,7 @@
 from forum_widgets import ForumSubscriptionForm, ThreadSubscriptionForm, AnnouncementsTable
 from forum_widgets import ModerateThread, ForumHeader, ThreadHeader
 from forum_widgets import Post, Thread, Forum
+
+__all__ = [
+    'ForumSubscriptionForm', 'ThreadSubscriptionForm', 'AnnouncementsTable', 'ModerateThread', 'ForumHeader',
+    'ThreadHeader', 'Post', 'Thread', 'Forum']

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeGit/forgegit/tests/functional/test_controllers.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/tests/functional/test_controllers.py b/ForgeGit/forgegit/tests/functional/test_controllers.py
index cdff7c8..0e0928d 100644
--- a/ForgeGit/forgegit/tests/functional/test_controllers.py
+++ b/ForgeGit/forgegit/tests/functional/test_controllers.py
@@ -42,7 +42,6 @@ from forgegit import model as GM
 
 
 class _TestCase(TestController):
-
     def setUp(self):
         super(_TestCase, self).setUp()
         self.setup_with_tools()
@@ -50,8 +49,7 @@ class _TestCase(TestController):
     @with_git
     def setup_with_tools(self):
         h.set_context('test', 'src-git', neighborhood='Projects')
-        repo_dir = pkg_resources.resource_filename(
-            'forgegit', 'tests/data')
+        repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
         c.app.repo.fs_path = repo_dir
         c.app.repo.status = 'ready'
         c.app.repo.name = 'testgit.git'
@@ -67,8 +65,7 @@ class _TestCase(TestController):
     @with_tool('test', 'Git', 'testgit-index', 'Git', type='git')
     def setup_testgit_index_repo(self):
         h.set_context('test', 'testgit-index', neighborhood='Projects')
-        repo_dir = pkg_resources.resource_filename(
-            'forgegit', 'tests/data')
+        repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
         c.app.repo.fs_path = repo_dir
         c.app.repo.status = 'ready'
         c.app.repo.name = 'testgit_index.git'
@@ -79,13 +76,10 @@ class _TestCase(TestController):
 
 
 class TestRootController(_TestCase):
-
-
     @with_tool('test', 'Git', 'weird-chars', 'WeirdChars', type='git')
     def _setup_weird_chars_repo(self):
         h.set_context('test', 'weird-chars', neighborhood='Projects')
-        repo_dir = pkg_resources.resource_filename(
-            'forgegit', 'tests/data')
+        repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
         c.app.repo.fs_path = repo_dir
         c.app.repo.status = 'ready'
         c.app.repo.name = 'weird-chars.git'
@@ -135,41 +129,34 @@ class TestRootController(_TestCase):
              u'message': u'Add README', u'row': 2})
 
     def test_log(self):
-        resp = self.app.get(
-            '/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/')
+        resp = self.app.get('/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/')
         assert 'Initial commit' in resp
         assert '<div class="markdown_content"><p>Change README</div>' in resp
         assert 'tree/README?format=raw">Download</a>' not in resp
-        assert 'Tree' in resp.html.findAll(
-            'td')[2].text, resp.html.findAll('td')[2].text
+        assert 'Tree' in resp.html.findAll('td')[2].text, resp.html.findAll('td')[2].text
         assert 'byRick Copeland' in resp.html.findAll('td')[0].text, resp.html.findAll('td')[0].text
-        resp = self.app.get(
-            '/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/README')
+        resp = self.app.get('/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/README')
         assert 'View' in resp.html.findAll('td')[2].text
         assert 'Change README' in resp
         assert 'tree/README?format=raw">Download</a>' in resp
         assert 'Add README' in resp
         assert "Initial commit " not in resp
-        resp = self.app.get(
-            '/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/a/b/c/')
+        resp = self.app.get('/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/a/b/c/')
         assert 'Remove file' in resp
         assert 'Initial commit' in resp
         assert 'Add README' not in resp
         assert 'Change README' not in resp
-        resp = self.app.get(
-            '/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/not/exist')
+        resp = self.app.get('/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/not/exist')
         assert 'No (more) commits' in resp
 
     def test_diff_ui(self):
-        r = self.app.get(
-            '/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/README')
+        r = self.app.get('/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/?path=/README')
         assert '<div class="grid-19"><input type="button" value="Compare" class="compare_revision"></div>' in r
         assert '<input type="checkbox" class="revision"' in r
         assert 'revision="1e146e67985dcd71c74de79613719bef7bddca4a"' in r
         assert 'url_commit="/p/test/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/">' in r
 
-        r = self.app.get(
-            '/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/')
+        r = self.app.get('/src-git/ci/1e146e67985dcd71c74de79613719bef7bddca4a/log/')
         assert '<div class="grid-19"><input type="button" value="Compare" class="compare_revision"></div>' not in r
         assert '<input type="checkbox" class="revision"' not in r
         assert 'revision="1e146e67985dcd71c74de79613719bef7bddca4a"' not in r
@@ -247,10 +234,8 @@ class TestRootController(_TestCase):
     def test_file(self):
         ci = self._get_ci()
         resp = self.app.get(ci + 'tree/README')
-        assert 'README' in resp.html.find(
-            'h2', {'class': 'dark title'}).contents[2]
-        content = str(
-            resp.html.find('div', {'class': 'clip grid-19 codebrowser'}))
+        assert 'README' in resp.html.find('h2', {'class': 'dark title'}).contents[2]
+        content = str(resp.html.find('div', {'class': 'clip grid-19 codebrowser'}))
         assert 'This is readme' in content, content
         assert '<span id="l1" class="code_block">' in resp
         assert 'var hash = window.location.hash.substring(1);' in resp
@@ -261,16 +246,14 @@ class TestRootController(_TestCase):
         url = ci + 'tree/' + h.urlquote(u'привіт.txt') + '?format=raw'
         resp = self.app.get(url)
         assert_in(u'Привіт!\nWhich means Hello!', resp.body.decode('utf-8'))
-        assert_equal(
-            resp.headers.get('Content-Disposition').decode('utf-8'),
-            u'attachment;filename="привіт.txt"')
+        assert_equal(resp.headers.get('Content-Disposition').decode('utf-8'),
+                     u'attachment;filename="привіт.txt"')
 
         url = ci + 'tree/' + h.urlquote(u'with space.txt') + '?format=raw'
         resp = self.app.get(url)
         assert_in(u'with space', resp.body.decode('utf-8'))
-        assert_equal(
-            resp.headers.get('Content-Disposition').decode('utf-8'),
-            u'attachment;filename="with space.txt"')
+        assert_equal(resp.headers.get('Content-Disposition').decode('utf-8'),
+                     u'attachment;filename="with space.txt"')
 
     def test_invalid_file(self):
         ci = self._get_ci()
@@ -278,8 +261,7 @@ class TestRootController(_TestCase):
 
     def test_diff(self):
         ci = self._get_ci()
-        resp = self.app.get(
-            ci + 'tree/README?diff=df30427c488aeab84b2352bdf88a3b19223f9d7a')
+        resp = self.app.get(ci + 'tree/README?diff=df30427c488aeab84b2352bdf88a3b19223f9d7a')
         assert 'readme' in resp, resp.showbrowser()
         assert '+++' in resp, resp.showbrowser()
 
@@ -287,8 +269,7 @@ class TestRootController(_TestCase):
         ci = self._get_ci()
         fn = 'tree/README?diff=df30427c488aeab84b2352bdf88a3b19223f9d7a'
         r = self.app.get(ci + fn + '&diformat=regular')
-        assert fn + \
-            '&amp;diformat=sidebyside">Switch to side-by-side view</a>' in r
+        assert fn + '&amp;diformat=sidebyside">Switch to side-by-side view</a>' in r
 
         r = self.app.get(ci + fn + '&diformat=sidebyside')
         assert fn + '&amp;diformat=regular">Switch to unified view</a>' in r
@@ -297,8 +278,7 @@ class TestRootController(_TestCase):
     def test_refresh(self):
         notification = M.Notification.query.find({'subject': '[test:src-git] 5 new commits to Git'}).first()
         assert notification
-        domain = '.'.join(
-            reversed(c.app.url[1:-1].split('/'))).replace('_', '-')
+        domain = '.'.join(reversed(c.app.url[1:-1].split('/'))).replace('_', '-')
         common_suffix = tg.config['forgemail.domain']
         email = 'noreply@%s%s' % (domain, common_suffix)
         assert_in(email, notification['reply_to_address'])
@@ -306,8 +286,7 @@ class TestRootController(_TestCase):
     def test_file_force_display(self):
         ci = self._get_ci()
         resp = self.app.get(ci + 'tree/README?force=True')
-        content = str(
-            resp.html.find('div', {'class': 'clip grid-19 codebrowser'}))
+        content = str(resp.html.find('div', {'class': 'clip grid-19 codebrowser'}))
         assert re.search(r'<pre>.*This is readme', content), content
         assert '</pre>' in content, content
 
@@ -320,8 +299,7 @@ class TestRootController(_TestCase):
         r = self.app.get(ci + 'tree/index.html')
         header = r.html.find('h2', {'class': 'dark title'}).contents[2]
         assert 'index.html' in header, header
-        content = str(
-            r.html.find('div', {'class': 'clip grid-19 codebrowser'}))
+        content = str(r.html.find('div', {'class': 'clip grid-19 codebrowser'}))
         assert ('<span class="nt">&lt;h1&gt;</span>'
                 'index.html'
                 '<span class="nt">&lt;/h1&gt;</span>') in content, content
@@ -335,8 +313,7 @@ class TestRootController(_TestCase):
         header = r.html.find('h2', {'class': 'dark title'})
         assert 'index' in header.contents[3], header.contents[3]
         assert 'index.htm' in header.contents[4], header.contents[4]
-        content = str(
-            r.html.find('div', {'class': 'clip grid-19 codebrowser'}))
+        content = str(r.html.find('div', {'class': 'clip grid-19 codebrowser'}))
         assert ('<span class="nt">&lt;h1&gt;</span>'
                 'index/index.htm'
                 '<span class="nt">&lt;/h1&gt;</span>') in content, content
@@ -387,9 +364,7 @@ class TestRootController(_TestCase):
         assert not '<div id="access_urls"' in r
         r = self.app.get('/src-git/fork')
         assert not '<div id="access_urls"' in r
-        r = self.app.get(
-            ci +
-            'tree/README?diff=df30427c488aeab84b2352bdf88a3b19223f9d7a')
+        r = self.app.get(ci + 'tree/README?diff=df30427c488aeab84b2352bdf88a3b19223f9d7a')
         assert not '<div id="access_urls"' in r
         r = self.app.get(ci + 'tree/README')
         assert not '<div id="access_urls"' in r
@@ -419,8 +394,7 @@ class TestRootController(_TestCase):
         self.setup_testgit_index_repo()
         r = self.app.get('/p/test/testgit-index/ci/master/tree/index/')
         form = r.html.find('form', 'tarball')
-        assert_equal(
-            form.get('action'), '/p/test/testgit-index/ci/master/tarball')
+        assert_equal(form.get('action'), '/p/test/testgit-index/ci/master/tarball')
         assert_equal(form.input.get('value'), '/index')
 
     def test_default_branch(self):
@@ -466,7 +440,6 @@ class TestRootController(_TestCase):
 
 
 class TestRestController(_TestCase):
-
     def test_index(self):
         self.app.get('/rest/p/test/src-git/', status=200)
 
@@ -475,7 +448,6 @@ class TestRestController(_TestCase):
 
 
 class TestHasAccessAPI(TestRestApiBase):
-
     def setUp(self):
         super(TestHasAccessAPI, self).setUp()
         self.setup_with_tools()
@@ -485,9 +457,9 @@ class TestHasAccessAPI(TestRestApiBase):
         pass
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/src-git/has_access', status=404)
-        r = self.api_get('/rest/p/test/src-git/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/src-git/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/src-git/has_access', status=404)
+        self.api_get('/rest/p/test/src-git/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/src-git/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""
@@ -526,7 +498,6 @@ class TestHasAccessAPI(TestRestApiBase):
 
 
 class TestFork(_TestCase):
-
     def setUp(self):
         super(TestFork, self).setUp()
         to_project = M.Project.query.get(
@@ -575,7 +546,8 @@ class TestFork(_TestCase):
         return r
 
     def _find_request_merge_form(self, resp):
-        cond = lambda f: f.action == 'do_request_merge'
+        def cond(f):
+            return f.action == 'do_request_merge'
         return self.find_form(resp, cond)
 
     def _request_merge(self, **kw):
@@ -684,8 +656,7 @@ class TestFork(_TestCase):
         assert 'Merge Request #%s:  (rejected)' % mr_num in r, r
 
     def test_merge_request_default_branches(self):
-        _select_val = lambda r, n: r.html.find(
-            'select', {'name': n}).find(selected=True).string
+        _select_val = lambda r, n: r.html.find('select', {'name': n}).find(selected=True).string
         r = self.app.get('/p/test2/code/request_merge')
         assert_equal(_select_val(r, 'source_branch'), 'master')
         assert_equal(_select_val(r, 'target_branch'), 'master')
@@ -719,11 +690,12 @@ class TestFork(_TestCase):
 
     def test_merge_request_edit(self):
         r = self.app.post('/p/test2/code/do_request_merge',
-            params={
-                'source_branch': 'zz',
-                'target_branch': 'master',
-                'summary': 'summary',
-                'description': 'description'}).follow()
+                          params={
+                              'source_branch': 'zz',
+                              'target_branch': 'master',
+                              'summary': 'summary',
+                              'description': 'description',
+                          }).follow()
         assert '<a href="edit" title="Edit"><b data-icon="p" class="ico ico-pencil" title="Edit"></b></a>' in r
         r = self.app.get('/p/test/src-git/merge-requests/1/edit')
         assert 'value="summary"' in r
@@ -732,20 +704,24 @@ class TestFork(_TestCase):
         assert md_edit is not None, 'MarkdownEdit widget not found'
 
         r = self.app.post('/p/test/src-git/merge-requests/1/do_request_merge_edit',
-            params={
-                'source_branch': 'zz',
-                'target_branch': 'master',
-                'summary': 'changed summary',
-                'description': 'changed description'},
-                extra_environ=dict(username='*anonymous'), status=302).follow()
+                          params={
+                              'source_branch': 'zz',
+                              'target_branch': 'master',
+                              'summary': 'changed summary',
+                              'description': 'changed description'
+                          },
+                          extra_environ=dict(username='*anonymous'),
+                          status=302,
+                          ).follow()
         assert 'Login' in r
 
         r = self.app.post('/p/test/src-git/merge-requests/1/do_request_merge_edit',
-            params={
-                'source_branch': 'master',
-                'target_branch': 'master',
-                'summary': 'changed summary',
-                'description': 'changed description'}).follow()
+                          params={
+                              'source_branch': 'master',
+                              'target_branch': 'master',
+                              'summary': 'changed summary',
+                              'description': 'changed description',
+                          }).follow()
 
         assert '[5c4724]' not in r
         assert '<p>changed description</p' in r
@@ -786,7 +762,6 @@ class TestFork(_TestCase):
 
 
 class TestDiff(TestController):
-
     def setUp(self):
         super(TestDiff, self).setUp()
         self.setup_with_tools()
@@ -794,8 +769,7 @@ class TestDiff(TestController):
     @with_git
     def setup_with_tools(self):
         h.set_context('test', 'src-git', neighborhood='Projects')
-        repo_dir = pkg_resources.resource_filename(
-            'forgegit', 'tests/data')
+        repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
         c.app.repo.fs_path = repo_dir
         c.app.repo.status = 'ready'
         c.app.repo.name = 'testmime.git'
@@ -805,19 +779,18 @@ class TestDiff(TestController):
         ThreadLocalORMSession.flush_all()
 
     def test_diff(self):
-        r = self.app.get(
-            '/src-git/ci/d961abbbf10341ee18a668c975842c35cfc0bef2/tree/1.png?barediff=2ce83a24e52c21e8d2146b1a04a20717c0bb08d7')
+        r = self.app.get('/src-git/ci/d961abbbf10341ee18a668c975842c35cfc0bef2/tree/1.png'
+                         '?barediff=2ce83a24e52c21e8d2146b1a04a20717c0bb08d7')
         assert 'alt="2ce83a2..."' in r
         assert 'alt="d961abb..."' in r
 
-        r = self.app.get(
-            '/src-git/ci/d961abbbf10341ee18a668c975842c35cfc0bef2/tree/1.png?diff=2ce83a24e52c21e8d2146b1a04a20717c0bb08d7')
+        r = self.app.get('/src-git/ci/d961abbbf10341ee18a668c975842c35cfc0bef2/tree/1.png'
+                         '?diff=2ce83a24e52c21e8d2146b1a04a20717c0bb08d7')
         assert 'alt="2ce83a2..."' in r
         assert 'alt="d961abb..."' in r
 
 
 class TestGitRename(TestController):
-
     def setUp(self):
         super(TestGitRename, self).setUp()
         self.setup_with_tools()
@@ -862,8 +835,9 @@ class TestGitRename(TestController):
 
         # the diff portion of the output
         resp_no_ws = re.sub(r'\s+', '', str(resp))
-        assert '<a href="/p/test/src-git/ci/fbb0644603bb6ecee3ebb62efe8c86efc9b84ee6/tree/f.txt">f.txt</a>to<a href="/p/test/src-git/ci/b120505a61225e6c14bee3e5b5862db81628c35c/tree/f2.txt">f2.txt</a>'.replace(' ','') \
-               in resp_no_ws
+        assert_in('<a href="/p/test/src-git/ci/fbb0644603bb6ecee3ebb62efe8c86efc9b84ee6/tree/f.txt">f.txt</a>'
+                  'to<a href="/p/test/src-git/ci/b120505a61225e6c14bee3e5b5862db81628c35c/tree/f2.txt">f2.txt</a>'
+                  .replace(' ', ''), resp_no_ws)
         assert '<span class="empty-diff">File was renamed.</span>' in resp
 
 
@@ -875,8 +849,7 @@ class TestGitBranch(TestController):
     @with_git
     def setup_with_tools(self):
         h.set_context('test', 'src-git', neighborhood='Projects')
-        repo_dir = pkg_resources.resource_filename(
-            'forgegit', 'tests/data')
+        repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
         c.app.repo.fs_path = repo_dir
         c.app.repo.status = 'ready'
         c.app.repo.name = 'test_branch.git'
@@ -892,7 +865,6 @@ class TestGitBranch(TestController):
 
 
 class TestIncludeMacro(_TestCase):
-
     def setUp(self):
         super(TestIncludeMacro, self).setUp()
         setup_global_objects()

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeImporters/forgeimporters/tests/google/test_extractor.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_extractor.py b/ForgeImporters/forgeimporters/tests/google/test_extractor.py
index fe74f9c..72a7d6c 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_extractor.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_extractor.py
@@ -182,7 +182,8 @@ class TestGoogleCodeProjectExtractor(TestCase):
 
     @without_module('html2text')
     def test_get_issue_basic_fields(self):
-        test_issue = open(pkg_resources.resource_filename('forgeimporters', 'tests/data/google/test-issue.html')).read()
+        test_issue = open(pkg_resources.resource_filename(
+            'forgeimporters', 'tests/data/google/test-issue.html')).read()
         gpe = self._make_extractor(test_issue)
 
         self.assertEqual(gpe.get_issue_creator().name, 'john...@gmail.com')
@@ -222,7 +223,8 @@ class TestGoogleCodeProjectExtractor(TestCase):
 
     @skipif(module_not_available('html2text'))
     def test_get_issue_basic_fields_html2text(self):
-        test_issue = open(pkg_resources.resource_filename('forgeimporters', 'tests/data/google/test-issue.html')).read()
+        test_issue = open(pkg_resources.resource_filename(
+            'forgeimporters', 'tests/data/google/test-issue.html')).read()
         gpe = self._make_extractor(test_issue)
         self.assertEqual(gpe.get_issue_creator().name, 'john...@gmail.com')
         self.assertEqual(gpe.get_issue_creator().url,
@@ -303,8 +305,9 @@ class TestGoogleCodeProjectExtractor(TestCase):
         attachments = gpe.get_issue_attachments()
         self.assertEqual(len(attachments), 1)
         self.assertEqual(attachments[0].filename, 'at1.txt')
-        self.assertEqual(
-            attachments[0].url, 'http://allura-google-importer.googlecode.com/issues/attachment?aid=70000000&name=at1.txt&token=3REU1M3JUUMt0rJUg7ldcELt6LA%3A1376059941255')
+        self.assertEqual(attachments[0].url,
+                         'http://allura-google-importer.googlecode.com/issues/attachment?aid=70000000&name=at1.txt'
+                         '&token=3REU1M3JUUMt0rJUg7ldcELt6LA%3A1376059941255')
         self.assertEqual(attachments[0].type, 'text/plain')
 
     def test_get_issue_ids(self):
@@ -367,8 +370,10 @@ class TestWithSetupForComments(TestCase):
     # These tests use iter_comments and 2 HTML pages of comments.
 
     def _create_extractor(self):
-        test_issue = open(pkg_resources.resource_filename('forgeimporters', 'tests/data/google/test-issue-first-page.html')).read()
-        test_issue_older = open(pkg_resources.resource_filename('forgeimporters', 'tests/data/google/test-issue-prev-page.html')).read()
+        test_issue = open(pkg_resources.resource_filename(
+            'forgeimporters', 'tests/data/google/test-issue-first-page.html')).read()
+        test_issue_older = open(pkg_resources.resource_filename(
+            'forgeimporters', 'tests/data/google/test-issue-prev-page.html')).read()
 
         class LocalTestExtractor(google.GoogleCodeProjectExtractor):
             def urlopen(self, url, **kw):
@@ -442,7 +447,8 @@ class TestWithSetupForComments(TestCase):
                 'author.name': 'john...@gmail.com',
                 'author.url': 'http://code.google.com/u/101557263855536553789/',
                 'created_date': 'Thu Aug  8 15:36:57 2013',
-                'body': 'Oh, I forgot one \\(with an inter\\-project reference to [issue other\\-project:1](https://code.google.com/p/other-project/issues/detail?id=1)\\)',
+                'body': 'Oh, I forgot one \\(with an inter\\-project reference to '
+                        '[issue other\\-project:1](https://code.google.com/p/other-project/issues/detail?id=1)\\)',
                 'updates': {'Labels:': 'OpSys-OSX'},
                 'attachments': [],
             },
@@ -511,7 +517,8 @@ class TestWithSetupForComments(TestCase):
                 'author.name': 'john...@gmail.com',
                 'author.url': 'http://code.google.com/u/101557263855536553789/',
                 'created_date': 'Thu Aug  8 15:36:57 2013',
-                'body': 'Oh, I forgot one \\(with an inter-project reference to [issue other-project:1](https://code.google.com/p/other-project/issues/detail?id=1)\\)',
+                'body': 'Oh, I forgot one \\(with an inter-project reference to '
+                        '[issue other-project:1](https://code.google.com/p/other-project/issues/detail?id=1)\\)',
                 'updates': {'Labels:': 'OpSys-OSX'},
                 'attachments': [],
             },

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeLink/forgelink/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeLink/forgelink/tests/functional/test_rest.py b/ForgeLink/forgelink/tests/functional/test_rest.py
index 7fd6485..b2ac3b3 100644
--- a/ForgeLink/forgelink/tests/functional/test_rest.py
+++ b/ForgeLink/forgelink/tests/functional/test_rest.py
@@ -91,9 +91,9 @@ class TestLinkHasAccess(TestRestApiBase):
         h.set_context('test', 'link', neighborhood='Projects')
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/link/has_access', status=404)
-        r = self.api_get('/rest/p/test/link/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/link/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/link/has_access', status=404)
+        self.api_get('/rest/p/test/link/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/link/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeTracker/forgetracker/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_rest.py b/ForgeTracker/forgetracker/tests/functional/test_rest.py
index 7d8d91a..4603b3d 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_rest.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_rest.py
@@ -259,9 +259,9 @@ class TestRestSearch(TestTrackerApiBase):
 class TestRestHasAccess(TestTrackerApiBase):
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/bugs/has_access', status=404)
-        r = self.api_get('/rest/p/test/bugs/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/bugs/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/bugs/has_access', status=404)
+        self.api_get('/rest/p/test/bugs/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/bugs/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeTracker/forgetracker/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index efcc59d..73ef421 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -67,11 +67,13 @@ class TrackerTestController(TestController):
         pass
 
     def _find_new_ticket_form(self, resp):
-        cond = lambda f: f.action.endswith('/save_ticket')
+        def cond(f):
+            return f.action.endswith('/save_ticket')
         return self.find_form(resp, cond)
 
     def _find_update_ticket_form(self, resp):
-        cond = lambda f: f.action.endswith('/update_ticket_from_widget')
+        def cond(f):
+            return f.action.endswith('/update_ticket_from_widget')
         return self.find_form(resp, cond)
 
     def new_ticket(self, mount_point='/bugs/', extra_environ=None, **kw):
@@ -363,8 +365,8 @@ class TestFunctionalController(TrackerTestController):
         assert 'test new ticket form description' in response
 
     def test_mass_edit(self):
-        ticket_view = self.new_ticket(summary='First Ticket').follow()
-        ticket_view = self.new_ticket(summary='Second Ticket').follow()
+        self.new_ticket(summary='First Ticket').follow()
+        self.new_ticket(summary='Second Ticket').follow()
         M.MonQTask.run_ready()
         first_ticket = tm.Ticket.query.find({'summary': 'First Ticket'}).first()
         second_ticket = tm.Ticket.query.find({'summary': 'Second Ticket'}).first()
@@ -627,7 +629,7 @@ class TestFunctionalController(TrackerTestController):
         r = self.app.get('/p/test/bugs/feed.atom', extra_environ=env)
         assert 'Private Ticket' not in r
         # ... or in the API ...
-        r = self.app.get('/rest/p/test/bugs/2/', extra_environ=env, status=401)
+        self.app.get('/rest/p/test/bugs/2/', extra_environ=env, status=401)
         r = self.app.get('/rest/p/test/bugs/', extra_environ=env)
         assert 'Private Ticket' not in r
 
@@ -870,8 +872,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'test comment'
         self.app.post(f['action'].encode('utf-8'), params=params,
                       headers={'Referer': '/bugs/1/'.encode("utf-8")})
@@ -881,7 +883,7 @@ class TestFunctionalController(TrackerTestController):
                       upload_files=[('file_info', 'test.txt', 'HiThere!')])
         r = self.app.get('/bugs/1/', dict(page=1))
         assert '<input class="submit delete_attachment file" type="submit" value="X"/>' in r
-        form = r.forms[5].submit()
+        r.forms[5].submit()
         r = self.app.get('/bugs/1/', dict(page=1))
         assert '<input class="submit delete_attachment" type="submit" value="X"/>' not in r
 
@@ -917,7 +919,7 @@ class TestFunctionalController(TrackerTestController):
         file_data = file(file_path).read()
         upload = ('attachment', file_name, file_data)
         self.new_ticket(summary='test new attachment')
-        ticket_editor = self.app.post('/bugs/1/update_ticket', {
+        self.app.post('/bugs/1/update_ticket', {
             'summary': 'zzz'
         }, upload_files=[upload]).follow()
         ticket = tm.Ticket.query.find({'ticket_num': 1}).first()
@@ -1116,8 +1118,8 @@ class TestFunctionalController(TrackerTestController):
             open_status_names='aa bb',
             closed_status_names='cc',
         )
-        r = self.app.post('/admin/bugs/set_custom_fields',
-                          params=variable_encode(params))
+        self.app.post('/admin/bugs/set_custom_fields',
+                      params=variable_encode(params))
         kw = {'custom_fields._number': ''}
         ticket_view = self.new_ticket(summary='test custom fields', **kw).follow()
         assert '<strong>Number</strong>:  --&gt;' not in ticket_view
@@ -1191,7 +1193,7 @@ class TestFunctionalController(TrackerTestController):
         assert 'Milestone' in ticket_view
         assert '1.0' in ticket_view
         assert 'zzzé' not in ticket_view
-        r = self.app.post('/bugs/update_milestones', {
+        self.app.post('/bugs/update_milestones', {
             'field_name': '_milestone',
             'milestones-0.old_name': '1.0',
             'milestones-0.new_name': 'zzzé',
@@ -1357,7 +1359,7 @@ class TestFunctionalController(TrackerTestController):
         self.new_ticket(summary='test first ticket')
         self.new_ticket(summary='test second ticket')
         p = M.Project.query.get(shortname='test')
-        tracker = p.app_instance('bugs')
+        p.app_instance('bugs')
         t = tm.Ticket.query.get(summary='test first ticket')
         t.reported_by_id = M.User.by_username('test-user-0')._id
         t = tm.Ticket.query.get(summary='test second ticket')
@@ -1422,8 +1424,8 @@ class TestFunctionalController(TrackerTestController):
             'sort': ''}).follow()
         r = self.app.get('/bugs/')
         assert sidebar_contains(r, 'This is not too long.')
-        r = self.app.post('/admin/bugs/bins/save_bin', {
-            'summary': 'This will be truncated because it is too long to show in the sidebar without being ridiculous.',
+        self.app.post('/admin/bugs/bins/save_bin', {
+            'summary': 'This will be truncated because it is too long to show in the sidebar without being ridiculous',
             'terms': 'aaa',
             'old_summary': '',
             'sort': ''}).follow()
@@ -1457,8 +1459,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = post_content
         r = self.app.post(f['action'].encode('utf-8'), params=params,
                           headers={'Referer': '/bugs/1/'.encode("utf-8")})
@@ -1473,8 +1475,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params['ticket_form.summary'] = new_summary
         r = self.app.post(f['action'].encode('utf-8'), params=params,
                           headers={'Referer': '/bugs/1/'.encode("utf-8")})
@@ -1492,8 +1494,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = post_content
         r = self.app.post(f['action'].encode('utf-8'), params=params,
                           headers={'Referer': '/bugs/1/'.encode("utf-8")})
@@ -1520,8 +1522,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = post_content
         self.app.post(f['action'].encode('utf-8'), params=params,
                       headers={'Referer': '/bugs/1/'.encode("utf-8")})
@@ -1534,8 +1536,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = post_form.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[post_form.find('textarea')['name']] = 'Tis a reply'
         r = self.app.post(post_link + 'reply',
                           params=params,
@@ -1559,7 +1561,8 @@ class TestFunctionalController(TrackerTestController):
         assert_in('test first ticket', str(ticket_rows))
         assert_in('test second ticket', str(ticket_rows))
         edit_link = response.html.find('a', {'title': 'Bulk Edit'})
-        expected_link = "/p/test/bugs/edit/?q=%21status%3Awont-fix+%26%26+%21status%3Aclosed&sort=snippet_s+asc&limit=25&filter=&page=0"
+        expected_link = "/p/test/bugs/edit/?q=%21status%3Awont-fix+%26%26+%21status%3Aclosed"\
+                        "&sort=snippet_s+asc&limit=25&filter=&page=0"
         assert_equal(expected_link, edit_link['href'])
         response = self.app.get(edit_link['href'])
         ticket_rows = response.html.find('tbody', {'class': 'ticket-list'})
@@ -2139,8 +2142,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = post_content
         r = self.app.post(f['action'].encode('utf-8'), params=params,
                           headers={'Referer': '/p/test2/bugs2/1/'.encode("utf-8")})
@@ -2317,7 +2320,7 @@ class TestFunctionalController(TrackerTestController):
 
     def test_tags(self):
         p = M.Project.query.get(shortname='test')
-        tracker = p.app_instance('bugs')
+        p.app_instance('bugs')
         self.new_ticket(summary='a', labels='tag1,tag2')
         self.new_ticket(summary='b', labels='tag2')
         self.new_ticket(summary='c', labels='42cc,test')
@@ -2336,8 +2339,8 @@ class TestFunctionalController(TrackerTestController):
         params = dict()
         inputs = f.findAll('input')
         for field in inputs:
-            if field.has_key('name'):
-                params[field['name']] = field.has_key('value') and field['value'] or ''
+            if field.has_key('name'):  # nopep8 - beautifulsoup3 actually uses has_key
+                params[field['name']] = field.get('value') or ''
         params[f.find('textarea')['name']] = 'test comment'
         self.app.post(f['action'].encode('utf-8'), params=params,
                       headers={'Referer': '/bugs/1/'.encode("utf-8")})
@@ -2392,7 +2395,9 @@ class TestFunctionalController(TrackerTestController):
             return_path, rcpts, body = _client.sendmail.call_args[0]
             body = body.split('\n')
             assert 'Subject: [test:bugs] #1 test <h2> ticket' in body
-            assert_in('<p><strong> <a class="alink" href="http://localhost:8080/p/test/bugs/1/">[bugs:#1]</a> test &lt;h2&gt; ticket</strong></p>', body)
+            assert_in('<p><strong> <a class="alink" href="http://localhost:8080/p/test/bugs/1/">[bugs:#1]</a>'
+                      ' test &lt;h2&gt; ticket</strong></p>',
+                      body)
 
     @patch('forgetracker.search.query_filter_choices')
     def test_multiselect(self, query_filter_choices):
@@ -2623,7 +2628,7 @@ class TestEmailMonitoring(TrackerTestController):
             if (('thread' in f['action']) and ('post' in f['action'])):
                 params = {i['name']: i.get('value', '')
                           for i in f.findAll('input')
-                          if i.has_key('name')}
+                          if i.has_key('name')}  # nopep8 - beautifulsoup3 actually uses has_key
                 params[f.find('textarea')['name']] = 'foobar'
                 self.app.post(str(f['action']), params)
                 break  # Do it only once if many forms met
@@ -2869,7 +2874,7 @@ class TestBulkMove(TrackerTestController):
         original_p = M.Project.query.get(shortname='test')
         tracker = p.app_instance('bugs')
         original_tracker = original_p.app_instance('bugs')
-        r = self.app.post('/p/test/bugs/move_tickets', {
+        self.app.post('/p/test/bugs/move_tickets', {
             'tracker': str(tracker.config._id),
             '__ticket_ids': [t._id for t in tickets],
             '__search': '',
@@ -2907,7 +2912,7 @@ class TestBulkMove(TrackerTestController):
         tickets[0].subscribe(user=first_user)
         tickets[1].subscribe(user=second_user)
         M.MonQTask.query.remove()
-        r = self.app.post('/p/test/bugs/move_tickets', {
+        self.app.post('/p/test/bugs/move_tickets', {
             'tracker': str(tracker.config._id),
             '__ticket_ids': [t._id for t in tickets],
             '__search': '',
@@ -2970,7 +2975,7 @@ class TestBulkMove(TrackerTestController):
         p = M.Project.query.get(shortname='test2')
         tracker = p.app_instance('bugs2')
         M.MonQTask.query.remove()
-        r = self.app.post('/p/test/bugs/move_tickets', {
+        self.app.post('/p/test/bugs/move_tickets', {
             'tracker': str(tracker.config._id),
             '__ticket_ids': [t._id for t in tickets],
             '__search': '',

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeWiki/forgewiki/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/tests/functional/test_rest.py b/ForgeWiki/forgewiki/tests/functional/test_rest.py
index 3bc61bb..4aba7f1 100644
--- a/ForgeWiki/forgewiki/tests/functional/test_rest.py
+++ b/ForgeWiki/forgewiki/tests/functional/test_rest.py
@@ -131,9 +131,9 @@ class TestWikiHasAccess(TestRestApiBase):
         h.set_context('test', 'wiki', neighborhood='Projects')
 
     def test_has_access_no_params(self):
-        r = self.api_get('/rest/p/test/wiki/has_access', status=404)
-        r = self.api_get('/rest/p/test/wiki/has_access?user=root', status=404)
-        r = self.api_get('/rest/p/test/wiki/has_access?perm=read', status=404)
+        self.api_get('/rest/p/test/wiki/has_access', status=404)
+        self.api_get('/rest/p/test/wiki/has_access?user=root', status=404)
+        self.api_get('/rest/p/test/wiki/has_access?perm=read', status=404)
 
     def test_has_access_unknown_params(self):
         """Unknown user and/or permission always False for has_access API"""

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/ForgeWiki/forgewiki/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/tests/functional/test_root.py b/ForgeWiki/forgewiki/tests/functional/test_root.py
index b716877..635e2b6 100644
--- a/ForgeWiki/forgewiki/tests/functional/test_root.py
+++ b/ForgeWiki/forgewiki/tests/functional/test_root.py
@@ -35,14 +35,6 @@ from alluratest.controller import TestController
 
 from forgewiki import model
 
-#---------x---------x---------x---------x---------x---------x---------x
-# RootController methods exposed:
-#     index, new_page, search
-# PageController methods exposed:
-#     index, edit, history, diff, raw, revert, update
-# CommentController methods exposed:
-#     reply, delete
-
 
 class TestRootController(TestController):
 
@@ -184,7 +176,8 @@ class TestRootController(TestController):
                 'text': 'sometext',
                 'labels': 'test label',
                 'viewable_by-0.id': 'all'}).follow()
-        assert '''<a href="/p/test/wiki/search/?q=labels_t:%22test label%22&parser=standard">test label (1)</a>''' in response
+        assert_in('<a href="/p/test/wiki/search/?q=labels_t:%22test label%22&parser=standard">test label (1)</a>',
+                  response)
 
     def test_title_slashes(self):
         # forward slash not allowed in wiki page title - converted to dash
@@ -335,9 +328,13 @@ class TestRootController(TestController):
                                             **Note:** The logo shown in the sidebar is no longer stored as an object in the wiki (as it was in the Hosted App installation). Rather save it as a regular file, then edit LocalSettings.php, adding""")
         self.app.post('/wiki/testdiff/update', params=d)
         response = self.app.get('/wiki/testdiff/diff?v1=1&v2=2')
-        assert '# Now fix <del> permissons. </del> <ins> permissions. </ins> Wrong permissions may cause <ins> a </ins> massive slowdown!' in response
+        assert_in('# Now fix <del> permissons. </del> <ins> permissions. </ins> '
+                  'Wrong permissions may cause <ins> a </ins> massive slowdown!',
+                  response)
         response = self.app.get('/wiki/testdiff/diff?v1=2&v2=1')
-        assert '# Now fix <del> permissions. </del> <ins> permissons. </ins> Wrong permissions may cause <del> a </del> massive slowdown!' in response
+        assert_in('# Now fix <del> permissions. </del> <ins> permissons. </ins> '
+                  'Wrong permissions may cause <del> a </del> massive slowdown!',
+                  response)
 
     def test_page_raw(self):
         self.app.post(
@@ -763,7 +760,7 @@ class TestRootController(TestController):
         assert inp is not None
         # subscribe
         self.app.post('/p/test/wiki/subscribe', {'subscribe': True},
-                     extra_environ={'username': str(user.username)}).follow()
+                      extra_environ={'username': str(user.username)}).follow()
         # user is subscribed
         assert M.Mailbox.subscribed(user_id=user._id)
         r = self.app.get('/p/test/wiki/Home/', extra_environ={'username': str(user.username)})
@@ -771,7 +768,7 @@ class TestRootController(TestController):
         assert inp is not None
         # unsubscribe
         self.app.post('/p/test/wiki/subscribe', {'unsubscribe': True},
-                     extra_environ={'username': str(user.username)}).follow()
+                      extra_environ={'username': str(user.username)}).follow()
         # user is not subscribed
         assert not M.Mailbox.subscribed(user_id=user._id)
         r = self.app.get('/p/test/wiki/Home/', extra_environ={'username': str(user.username)})

http://git-wip-us.apache.org/repos/asf/allura/blob/f2bd03c7/scripts/teamforge-import.py
----------------------------------------------------------------------
diff --git a/scripts/teamforge-import.py b/scripts/teamforge-import.py
index 9f601a0..b668128 100644
--- a/scripts/teamforge-import.py
+++ b/scripts/teamforge-import.py
@@ -305,18 +305,7 @@ def convert_project_shortname(teamforge_path):
 
 # FIXME hardcoded
 skip_perms_usernames = set([
-    'faisal_saeed', 'dsarkisian', 'debonairamit', 'nishanthiremath', 'Bhuvnesh', 'bluetooth', 'cnkurzke', 'makow2', 'jannes1', 'Joel_Hegberg', 'Farroc', 'brian_chen', 'eirikur',
-    'dmitry_flyorov', 'bipingm', 'MornayJo', 'ibv', 'b_weisshaar', 'k9srb', 'johnmmills', 'a_gomolitsky', 'filim', 'kapoor', 'ljzegers', 'jrukes', 'dwilson9', 'jlin', 'quickie',
-    'johnbell', 'nnikolenko', 'Gaetan', 'Giannetta', 'Katia', 'jackhan', 'jacobwangus', 'adwankar', 'dinobrusco', 'qbarnes', 'ilmojung', 'clifford_chan', 'nbaig', 'fhutchi1',
-    'rinofarina', 'baiyanbin', 'muralidhar', 'duanyiruo', 'bredding', 'mkolkey', 'manvith', 'nanduk', 'engyihan', 'deepsie', 'dabon', 'dino_jiang', 'mattrose', 'peter_j_wilhelm',
-    'emx2500', 'jmcguire', 'lfilimowski', 'guruppandit', 'abhilashisme', 'edwinhm', 'rabbi', 'ferrans', 'guna', 'kevin_robinson', 'adathiruthi', 'kochen', 'onehap', 'kalanithi',
-    'jamesn', 'obu001', 'chetanv', 'Avinash', 'HugoBoss', 'Han_Wei', 'mhooper', 'g16872', 'mfcarignano', 'jim_burke', 'kevin', 'arunkarra', 'adam_feng', 'pavan_scm', 'kostya_katz',
-    'ppazderka', 'eileenzhuang', 'pyammine', 'judyho', 'ashoykh', 'rdemento', 'ibrahim', 'min_wang', 'arvind_setlur', 'moorthy_karthik', 'daniel_nelson', 'dms', 'esnmurthy',
-    'rasa_bonyadlou', 'prashantjoshi', 'edkeating', 'billsaez', 'cambalindo', 'jims', 'bozkoyun', 'andry_deltsov', 'bpowers', 'manuel_milli', 'maryparsons', 'spriporov', 'yutianli',
-    'xiebin', 'tnemeth1', 'udayaps', 'zzzzuser', 'timberger', 'sbarve1', 'zarman', 'rwallace67', 'thangavelu_arum', 'yuhuaixie', 'tingup', 'sekchai', 'sasanplus', 'rupal', 'sebastien_hertz',
-    'sab8123', 'rony_lim', 'slava_kirillin', 'smwest', 'wendydu_yq', 'sco002', 'RonFred', 'spatnala', 'vd', 'Sunny', 'tthompson', 'sunijams', 'slaw', 'rodovich', 'zhangqingqi82', 'venki',
-    'yuntaom', 'xiaojin', 'walterciocosta', 'straus', 'Thomas', 'stupka', 'wangyu', 'yaowang', 'wisekb', 'tyler_louie', 'smartgarfield', 'shekar_mahalingam',
-    'venkata_akella', 'v_yellapragada', 'vavasthi', 'rpatel', 'zhengfang', 'sweetybala', 'vap', 'sergey', 'ymhuang', 'spatel78745'
+    'username1', 'username2', 'username3'
 ])
 
 
@@ -583,9 +572,9 @@ def import_discussion(project, pid, frs_mapping, sf_project_shortname, nbhd):
                                 parent=p.parent, timestamp=create_date)
                             p.slug = slug
                             p.full_slug = full_slug
-                            if oldest_post == None or oldest_post.timestamp > create_date:
+                            if oldest_post is None or oldest_post.timestamp > create_date:
                                 oldest_post = p
-                            if newest_post == None or newest_post.timestamp < create_date:
+                            if newest_post is None or newest_post.timestamp < create_date:
                                 newest_post = p
                             ThreadLocalORMSession.flush_all()
                     to.num_replies = to_num_replies
@@ -901,7 +890,8 @@ def _dir_sql(created_on, project, dir_name, rel_path):
       AND pfs_type = 'd'
       AND pfs_name = '%s'
       AND parent_directory = %s;
-    """ % (created_on, convert_project_shortname(project.path), options.neighborhood_shortname, dir_name, parent_directory)
+    """ % (created_on, convert_project_shortname(project.path), options.neighborhood_shortname,
+           dir_name, parent_directory)
     return sql