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 2024/10/30 17:14:12 UTC

(allura) branch master updated (7b3ac92ad -> bce9a59c2)

This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git


    from 7b3ac92ad py312 prep - Conversion of remaining unitest-style assertions
     new c5b05e28c __all__ for model/__init__.py files
     new 8475df609 clean up unused imports, mark helpers.py lines that we need to keep
     new bce9a59c2 pep8 reformatting

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 Allura/allura/command/base.py                      |   1 -
 Allura/allura/command/create_trove_categories.py   |   1 -
 Allura/allura/command/reclone_repo.py              |   1 -
 Allura/allura/command/script.py                    |   1 -
 Allura/allura/command/show_models.py               |   2 -
 Allura/allura/command/taskd.py                     |   1 -
 Allura/allura/config/app_cfg.py                    |   2 +-
 Allura/allura/config/middleware.py                 |   3 -
 Allura/allura/controllers/auth.py                  |   2 +-
 Allura/allura/controllers/basetest_project_root.py |   2 -
 Allura/allura/controllers/discuss.py               |   6 +-
 Allura/allura/controllers/newforge.py              |   2 +-
 Allura/allura/controllers/project.py               |   2 -
 Allura/allura/controllers/repository.py            |   4 +-
 Allura/allura/controllers/rest.py                  |   4 +-
 Allura/allura/controllers/root.py                  |   2 +-
 Allura/allura/controllers/site_admin.py            |   2 +-
 Allura/allura/controllers/trovecategories.py       |   1 -
 Allura/allura/ext/admin/admin_main.py              |   6 +-
 Allura/allura/ext/admin/widgets.py                 |   2 -
 Allura/allura/ext/user_profile/user_main.py        |   3 +-
 Allura/allura/lib/app_globals.py                   |   3 -
 Allura/allura/lib/custom_middleware.py             |   6 +-
 Allura/allura/lib/decorators.py                    |   3 -
 Allura/allura/lib/diff.py                          |   2 +-
 Allura/allura/lib/helpers.py                       |  17 ++-
 Allura/allura/lib/macro.py                         |   1 -
 Allura/allura/lib/markdown_extensions.py           |   2 -
 Allura/allura/lib/multifactor.py                   |   1 -
 Allura/allura/lib/patches.py                       |   6 +-
 Allura/allura/lib/phone/nexmo.py                   |   1 -
 Allura/allura/lib/plugin.py                        |   5 +-
 Allura/allura/lib/project_create_helpers.py        |   2 -
 Allura/allura/lib/repository.py                    |   1 -
 Allura/allura/lib/search.py                        |   3 -
 Allura/allura/lib/security.py                      |   2 +-
 Allura/allura/lib/solr.py                          |   5 +-
 Allura/allura/lib/spam/stopforumspamfilter.py      |   1 -
 Allura/allura/lib/utils.py                         |   4 +-
 Allura/allura/lib/validators.py                    |   1 -
 Allura/allura/lib/widgets/auth_widgets.py          |   2 -
 Allura/allura/lib/widgets/form_fields.py           |   2 -
 Allura/allura/lib/widgets/forms.py                 |   1 -
 Allura/allura/lib/widgets/oauth_widgets.py         |   2 -
 Allura/allura/lib/widgets/project_list.py          |   7 +-
 Allura/allura/model/artifact.py                    |   1 -
 Allura/allura/model/auth.py                        |   6 +-
 Allura/allura/model/discuss.py                     |   4 +-
 Allura/allura/model/index.py                       |   3 +-
 Allura/allura/model/monq_model.py                  |   2 +-
 Allura/allura/model/neighborhood.py                |   2 +-
 Allura/allura/model/notification.py                |   6 +-
 Allura/allura/model/repo_refresh.py                |   6 +-
 Allura/allura/model/repository.py                  |   2 +-
 Allura/allura/model/session.py                     |   4 +-
 Allura/allura/model/timeline.py                    |   1 +
 Allura/allura/model/webhook.py                     |   1 -
 Allura/allura/scripts/refreshrepo.py               |   2 +-
 Allura/allura/scripts/reindex_projects.py          |   2 +-
 Allura/allura/tasks/admin_tasks.py                 |   1 +
 Allura/allura/tasks/event_tasks.py                 |   1 -
 Allura/allura/tasks/export_tasks.py                |   1 -
 Allura/allura/tasks/index_tasks.py                 |   1 -
 Allura/allura/tasks/repo_tasks.py                  |   1 -
 Allura/allura/templates/__init__.py                |   1 -
 Allura/allura/templates_responsive/__init__.py     |   2 +-
 Allura/allura/tests/exclude_from_rewrite_hook.py   |   2 +-
 Allura/allura/tests/functional/__init__.py         |   1 -
 Allura/allura/tests/functional/test_admin.py       |   2 +-
 Allura/allura/tests/functional/test_auth.py        |  58 +++++---
 Allura/allura/tests/functional/test_discuss.py     |   2 -
 Allura/allura/tests/functional/test_feeds.py       |   2 +-
 .../tests/functional/test_personal_dashboard.py    |   2 +-
 Allura/allura/tests/functional/test_rest.py        |   3 +-
 Allura/allura/tests/functional/test_root.py        |   3 +-
 Allura/allura/tests/functional/test_site_admin.py  |   1 -
 Allura/allura/tests/model/__init__.py              |   1 -
 Allura/allura/tests/model/test_artifact.py         |   2 +
 Allura/allura/tests/model/test_auth.py             |  16 +--
 Allura/allura/tests/model/test_discussion.py       |   2 +-
 Allura/allura/tests/model/test_filesystem.py       |   2 +
 Allura/allura/tests/model/test_notification.py     |   1 -
 Allura/allura/tests/model/test_repo.py             |  14 +-
 Allura/allura/tests/scripts/__init__.py            |   1 -
 .../tests/scripts/test_create_sitemap_files.py     |   2 +-
 Allura/allura/tests/templates/__init__.py          |   1 -
 .../tests/templates/jinja_master/__init__.py       |   1 -
 Allura/allura/tests/test_decorators.py             |   2 +-
 Allura/allura/tests/test_diff.py                   |   1 -
 Allura/allura/tests/test_globals.py                |   5 +-
 Allura/allura/tests/test_helpers.py                |   6 +-
 Allura/allura/tests/test_mail_util.py              |   1 -
 Allura/allura/tests/test_markdown.py               |   3 +-
 Allura/allura/tests/test_plugin.py                 |   6 +-
 Allura/allura/tests/test_scripttask.py             |   1 -
 Allura/allura/tests/test_security.py               |   2 +-
 Allura/allura/tests/test_tasks.py                  |   1 -
 Allura/allura/tests/test_utils.py                  |   2 -
 Allura/allura/tests/test_validators.py             |   6 +-
 Allura/allura/tests/test_webhooks.py               |   1 -
 .../test_discussion_moderation_controller.py       |   2 +-
 Allura/allura/tests/unit/spam/test_spam_filter.py  |   1 -
 Allura/allura/tests/unit/test_app.py               |   2 +-
 Allura/allura/tests/unit/test_artifact.py          |   3 +-
 Allura/allura/tests/unit/test_project.py           |   1 -
 Allura/allura/tests/unit/test_repo.py              |   2 -
 Allura/allura/tests/unit/test_session.py           |   4 +-
 Allura/allura/tests/unit/test_sitemapentry.py      |   1 -
 Allura/allura/tests/unit/test_solr.py              |   3 +-
 Allura/allura/webhooks.py                          |   1 -
 Allura/allura/websetup/bootstrap.py                |   9 +-
 Allura/allura/websetup/schema.py                   |   1 -
 Allura/ldap-setup.py                               |   1 +
 Allura/ldap-userconfig.py                          |   1 +
 Allura/setup.py                                    |   2 +-
 AlluraTest/alluratest/controller.py                |   5 +-
 AlluraTest/alluratest/smtp_debug.py                |   2 +-
 AlluraTest/alluratest/test_syntax.py               |   1 -
 AlluraTest/alluratest/tools.py                     |   2 -
 AlluraTest/alluratest/validation.py                |   5 -
 ForgeActivity/forgeactivity/main.py                |   2 +-
 .../forgeactivity/tests/functional/test_root.py    |   2 +-
 ForgeBlog/forgeblog/model/__init__.py              |   7 +
 ForgeBlog/forgeblog/model/blog.py                  |   1 -
 ForgeBlog/forgeblog/tests/test_commands.py         |   5 +-
 ForgeBlog/forgeblog/widgets.py                     |   2 +-
 ForgeChat/forgechat/model/__init__.py              |   5 +
 ForgeChat/forgechat/model/chat.py                  |   1 +
 .../forgediscussion/controllers/forum.py           |   1 -
 .../forgediscussion/controllers/root.py            |   2 +-
 ForgeDiscussion/forgediscussion/forum_main.py      |   1 -
 ForgeDiscussion/forgediscussion/import_support.py  |   1 -
 ForgeDiscussion/forgediscussion/model/__init__.py  |   7 +
 ForgeDiscussion/forgediscussion/model/forum.py     |   2 -
 .../forgediscussion/tests/functional/test_forum.py |   1 -
 .../forgediscussion/widgets/forum_widgets.py       |   4 +-
 ForgeFeedback/forgefeedback/feedback_main.py       |  14 +-
 ForgeFeedback/forgefeedback/model/__init__.py      |   2 +
 ForgeFeedback/forgefeedback/model/feedback.py      |   5 -
 .../forgefeedback/tests/functional/test_root.py    |   5 -
 ForgeFeedback/setup.py                             |   4 -
 ForgeFiles/forgefiles/files_main.py                |  19 +--
 ForgeFiles/forgefiles/model/__init__.py            |   5 +
 ForgeFiles/forgefiles/model/files.py               |   3 -
 ForgeFiles/forgefiles/tests/__init__.py            |   1 -
 ForgeFiles/forgefiles/tests/functional/__init__.py |   1 -
 .../forgefiles/tests/functional/test_root.py       |   2 +-
 ForgeFiles/forgefiles/tests/model/__init__.py      |   1 -
 ForgeGit/forgegit/controllers.py                   |   2 +-
 ForgeGit/forgegit/model/__init__.py                |   2 +
 ForgeGit/forgegit/tests/model/test_repository.py   |   1 -
 ForgeGit/forgegit/tests/test_git_app.py            |   1 -
 ForgeGit/forgegit/tests/test_tasks.py              |   2 -
 ForgeImporters/forgeimporters/forge/discussion.py  |  40 +++---
 .../forgeimporters/github/tests/test_utils.py      |   2 +-
 .../forgeimporters/github/tests/test_wiki.py       |   2 +-
 ForgeImporters/forgeimporters/github/tracker.py    |   1 -
 ForgeImporters/forgeimporters/github/wiki.py       |   1 -
 .../forgeimporters/tests/forge/test_discussion.py  | 154 ++++++++++-----------
 .../forgeimporters/tests/forge/test_tracker.py     |   4 +-
 .../tests/github/functional/test_github.py         |   1 -
 .../forgeimporters/tests/github/test_tracker.py    |   2 +-
 ForgeImporters/forgeimporters/tests/test_base.py   |   4 +-
 .../forgeimporters/trac/tests/test_tickets.py      |  13 +-
 ForgeSVN/forgesvn/controllers.py                   |   2 +-
 ForgeSVN/forgesvn/model/__init__.py                |   2 +
 ForgeSVN/forgesvn/model/svn.py                     |   3 +-
 ForgeSVN/forgesvn/svn_main.py                      |   1 -
 ForgeSVN/forgesvn/tests/functional/test_auth.py    |   2 +-
 ForgeSVN/forgesvn/tests/model/test_repository.py   |   3 +-
 ForgeSVN/forgesvn/tests/test_svn_app.py            |   1 -
 ForgeSVN/forgesvn/tests/test_tasks.py              |   1 -
 ForgeShortUrl/forgeshorturl/model/__init__.py      |   2 +
 ForgeShortUrl/forgeshorturl/model/shorturl.py      |   2 +-
 ForgeTracker/forgetracker/import_support.py        |   3 +-
 ForgeTracker/forgetracker/model/__init__.py        |   8 ++
 ForgeTracker/forgetracker/model/ticket.py          |   1 -
 ForgeTracker/forgetracker/plugins.py               |   2 -
 ForgeTracker/forgetracker/search.py                |   3 +-
 .../forgetracker/tests/functional/test_root.py     |   4 -
 .../tests/unit/test_root_controller.py             |   1 -
 .../forgetracker/tests/unit/test_ticket_model.py   |   3 +-
 ForgeTracker/forgetracker/widgets/ticket_form.py   |   1 -
 ForgeTracker/forgetracker/widgets/ticket_search.py |   2 -
 .../forgeuserstats/controllers/userstats.py        |   1 -
 ForgeUserStats/forgeuserstats/tests/test_model.py  |   5 +-
 ForgeUserStats/forgeuserstats/tests/test_stats.py  |   1 -
 ForgeWiki/forgewiki/converters.py                  |   1 -
 ForgeWiki/forgewiki/model/__init__.py              |   7 +
 ForgeWiki/forgewiki/model/wiki.py                  |   2 +-
 ForgeWiki/forgewiki/tests/test_models.py           |   1 +
 conftest.py                                        |   3 +-
 run_tests                                          |   1 -
 scripts/changelog.py                               |   1 +
 scripts/migrations/013-update-ordinals.py          |   1 +
 .../015-add-neighborhood_id-to-blog-posts.py       |   1 +
 .../migrations/020-remove-wiki-title-slashes.py    |   1 +
 scripts/migrations/022-change-anon-display-name.py |   1 +
 .../migrations/024-migrate-custom-profile-text.py  |   1 +
 scripts/migrations/025-add-is-nbhd-project.py      |   1 +
 scripts/migrations/026-install-activity-tool.py    |   1 +
 .../027-change-ticket-write-permissions.py         |   1 +
 scripts/migrations/028-remove-svn-trees.py         |   1 +
 scripts/migrations/029-set-mailbox-queue_empty.py  |   1 +
 .../migrations/031-set-user-pending-to-false.py    |   1 +
 .../032-subscribe-merge-request-submitters.py      |   2 +-
 .../033-change-comment-anon-permissions.py         |   5 +-
 ...34-update_subscriptions_ticket_and_mr_titles.py |   3 +-
 scripts/perf/generate-projects.py                  |   1 -
 scripts/perf/load-up-forum.py                      |   9 +-
 scripts/perf/sstress.py                            |   1 +
 scripts/perf/test_git_lcd.py                       |   1 +
 scripts/trac_import.py                             |   1 -
 213 files changed, 352 insertions(+), 475 deletions(-)


(allura) 01/03: __all__ for model/__init__.py files

Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git

commit c5b05e28c62a634227297b84bd892a5cd0eb7acd
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Wed Oct 30 12:39:47 2024 -0400

    __all__ for model/__init__.py files
---
 ForgeBlog/forgeblog/model/__init__.py             | 7 +++++++
 ForgeChat/forgechat/model/__init__.py             | 5 +++++
 ForgeDiscussion/forgediscussion/model/__init__.py | 7 +++++++
 ForgeFeedback/forgefeedback/model/__init__.py     | 2 ++
 ForgeFiles/forgefiles/model/__init__.py           | 5 +++++
 ForgeGit/forgegit/model/__init__.py               | 2 ++
 ForgeSVN/forgesvn/model/__init__.py               | 2 ++
 ForgeShortUrl/forgeshorturl/model/__init__.py     | 2 ++
 ForgeTracker/forgetracker/model/__init__.py       | 8 ++++++++
 ForgeWiki/forgewiki/model/__init__.py             | 7 +++++++
 10 files changed, 47 insertions(+)

diff --git a/ForgeBlog/forgeblog/model/__init__.py b/ForgeBlog/forgeblog/model/__init__.py
index ab9c86430..b19bbce9f 100644
--- a/ForgeBlog/forgeblog/model/__init__.py
+++ b/ForgeBlog/forgeblog/model/__init__.py
@@ -16,3 +16,10 @@
 #       under the License.
 
 from .blog import Globals, BlogPost, BlogAttachment, BlogPostSnapshot
+
+__all__ = [
+    'Globals',
+    'BlogPost',
+    'BlogAttachment',
+    'BlogPostSnapshot',
+]
diff --git a/ForgeChat/forgechat/model/__init__.py b/ForgeChat/forgechat/model/__init__.py
index af6d392e4..bf073aa38 100644
--- a/ForgeChat/forgechat/model/__init__.py
+++ b/ForgeChat/forgechat/model/__init__.py
@@ -16,3 +16,8 @@
 #       under the License.
 
 from .chat import ChatChannel, ChatMessage
+
+__all__ = [
+    'ChatChannel',
+    'ChatMessage',
+]
diff --git a/ForgeDiscussion/forgediscussion/model/__init__.py b/ForgeDiscussion/forgediscussion/model/__init__.py
index b1a4d1467..c17446d9b 100644
--- a/ForgeDiscussion/forgediscussion/model/__init__.py
+++ b/ForgeDiscussion/forgediscussion/model/__init__.py
@@ -16,3 +16,10 @@
 #       under the License.
 
 from .forum import Forum, ForumThread, ForumPost, ForumAttachment
+
+__all__ = [
+    'Forum',
+    'ForumThread',
+    'ForumPost',
+    'ForumAttachment',
+]
diff --git a/ForgeFeedback/forgefeedback/model/__init__.py b/ForgeFeedback/forgefeedback/model/__init__.py
index 3fb8ad007..e9579136a 100644
--- a/ForgeFeedback/forgefeedback/model/__init__.py
+++ b/ForgeFeedback/forgefeedback/model/__init__.py
@@ -16,3 +16,5 @@
 #       under the License.
 
 from .feedback import Feedback
+
+__all__ = ['Feedback']
diff --git a/ForgeFiles/forgefiles/model/__init__.py b/ForgeFiles/forgefiles/model/__init__.py
index a0f0fee65..2e6c80409 100755
--- a/ForgeFiles/forgefiles/model/__init__.py
+++ b/ForgeFiles/forgefiles/model/__init__.py
@@ -16,3 +16,8 @@
 #       under the License.
 
 from .files import UploadFolder, UploadFiles
+
+__all__ = [
+    'UploadFolder',
+    'UploadFiles',
+]
diff --git a/ForgeGit/forgegit/model/__init__.py b/ForgeGit/forgegit/model/__init__.py
index 65eeb2151..98ad5c392 100644
--- a/ForgeGit/forgegit/model/__init__.py
+++ b/ForgeGit/forgegit/model/__init__.py
@@ -16,3 +16,5 @@
 #       under the License.
 
 from .git_repo import Repository
+
+__all__ = ['Repository']
diff --git a/ForgeSVN/forgesvn/model/__init__.py b/ForgeSVN/forgesvn/model/__init__.py
index bdfca0d74..adbe580fb 100644
--- a/ForgeSVN/forgesvn/model/__init__.py
+++ b/ForgeSVN/forgesvn/model/__init__.py
@@ -16,3 +16,5 @@
 #       under the License.
 
 from .svn import Repository
+
+__all__ = ['Repository']
diff --git a/ForgeShortUrl/forgeshorturl/model/__init__.py b/ForgeShortUrl/forgeshorturl/model/__init__.py
index 34e1ff7b2..6f718263d 100644
--- a/ForgeShortUrl/forgeshorturl/model/__init__.py
+++ b/ForgeShortUrl/forgeshorturl/model/__init__.py
@@ -16,3 +16,5 @@
 #       under the License.
 
 from .shorturl import ShortUrl
+
+__all__ = ['ShortUrl']
diff --git a/ForgeTracker/forgetracker/model/__init__.py b/ForgeTracker/forgetracker/model/__init__.py
index 4e0d859d6..31aa22c32 100644
--- a/ForgeTracker/forgetracker/model/__init__.py
+++ b/ForgeTracker/forgetracker/model/__init__.py
@@ -16,3 +16,11 @@
 #       under the License.
 
 from .ticket import Globals, Bin, Ticket, TicketAttachment, MovedTicket
+
+__all__ = [
+    'Globals',
+    'Bin',
+    'Ticket',
+    'TicketAttachment',
+    'MovedTicket',
+]
diff --git a/ForgeWiki/forgewiki/model/__init__.py b/ForgeWiki/forgewiki/model/__init__.py
index 9a9a6923d..2cc99d855 100644
--- a/ForgeWiki/forgewiki/model/__init__.py
+++ b/ForgeWiki/forgewiki/model/__init__.py
@@ -16,3 +16,10 @@
 #       under the License.
 
 from .wiki import Page, WikiAttachment, Globals, PageHistory
+
+__all__ = [
+    'Page',
+    'WikiAttachment',
+    'Globals',
+    'PageHistory',
+]


(allura) 02/03: clean up unused imports, mark helpers.py lines that we need to keep

Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git

commit 8475df60918ea5cf560584000a692bf87906ad34
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Wed Oct 30 12:59:17 2024 -0400

    clean up unused imports, mark helpers.py lines that we need to keep
---
 Allura/allura/command/base.py                             |  1 -
 Allura/allura/command/create_trove_categories.py          |  1 -
 Allura/allura/command/reclone_repo.py                     |  1 -
 Allura/allura/command/script.py                           |  1 -
 Allura/allura/command/show_models.py                      |  2 --
 Allura/allura/command/taskd.py                            |  1 -
 Allura/allura/config/app_cfg.py                           |  2 +-
 Allura/allura/config/middleware.py                        |  3 ---
 Allura/allura/controllers/auth.py                         |  1 -
 Allura/allura/controllers/basetest_project_root.py        |  2 --
 Allura/allura/controllers/discuss.py                      |  6 ++----
 Allura/allura/controllers/newforge.py                     |  2 +-
 Allura/allura/controllers/project.py                      |  2 --
 Allura/allura/controllers/repository.py                   |  4 +---
 Allura/allura/controllers/rest.py                         |  3 +--
 Allura/allura/controllers/root.py                         |  2 +-
 Allura/allura/controllers/site_admin.py                   |  2 +-
 Allura/allura/controllers/trovecategories.py              |  1 -
 Allura/allura/ext/admin/admin_main.py                     |  6 ++----
 Allura/allura/ext/admin/widgets.py                        |  2 --
 Allura/allura/ext/user_profile/user_main.py               |  3 +--
 Allura/allura/lib/app_globals.py                          |  3 ---
 Allura/allura/lib/custom_middleware.py                    |  2 +-
 Allura/allura/lib/decorators.py                           |  3 ---
 Allura/allura/lib/diff.py                                 |  2 +-
 Allura/allura/lib/helpers.py                              | 15 ++++++---------
 Allura/allura/lib/macro.py                                |  1 -
 Allura/allura/lib/markdown_extensions.py                  |  2 --
 Allura/allura/lib/multifactor.py                          |  1 -
 Allura/allura/lib/patches.py                              |  4 ----
 Allura/allura/lib/phone/nexmo.py                          |  1 -
 Allura/allura/lib/plugin.py                               |  4 +---
 Allura/allura/lib/project_create_helpers.py               |  2 --
 Allura/allura/lib/repository.py                           |  1 -
 Allura/allura/lib/search.py                               |  3 ---
 Allura/allura/lib/solr.py                                 |  1 -
 Allura/allura/lib/spam/stopforumspamfilter.py             |  1 -
 Allura/allura/lib/utils.py                                |  4 +---
 Allura/allura/lib/validators.py                           |  1 -
 Allura/allura/lib/widgets/auth_widgets.py                 |  2 --
 Allura/allura/lib/widgets/form_fields.py                  |  2 --
 Allura/allura/lib/widgets/forms.py                        |  1 -
 Allura/allura/lib/widgets/oauth_widgets.py                |  1 -
 Allura/allura/lib/widgets/project_list.py                 |  1 -
 Allura/allura/model/artifact.py                           |  1 -
 Allura/allura/model/auth.py                               |  4 ----
 Allura/allura/model/discuss.py                            |  2 --
 Allura/allura/model/index.py                              |  1 -
 Allura/allura/model/monq_model.py                         |  2 +-
 Allura/allura/model/neighborhood.py                       |  2 +-
 Allura/allura/model/notification.py                       |  2 --
 Allura/allura/model/repo_refresh.py                       |  4 ++--
 Allura/allura/model/repository.py                         |  2 +-
 Allura/allura/model/session.py                            |  2 --
 Allura/allura/model/webhook.py                            |  1 -
 Allura/allura/scripts/reindex_projects.py                 |  2 +-
 Allura/allura/tasks/event_tasks.py                        |  1 -
 Allura/allura/tasks/export_tasks.py                       |  1 -
 Allura/allura/tasks/index_tasks.py                        |  1 -
 Allura/allura/tasks/repo_tasks.py                         |  1 -
 Allura/allura/tests/functional/test_auth.py               |  4 ++--
 Allura/allura/tests/functional/test_discuss.py            |  2 --
 Allura/allura/tests/functional/test_rest.py               |  1 -
 Allura/allura/tests/functional/test_root.py               |  1 -
 Allura/allura/tests/functional/test_site_admin.py         |  1 -
 Allura/allura/tests/model/test_auth.py                    |  2 +-
 Allura/allura/tests/model/test_notification.py            |  1 -
 Allura/allura/tests/model/test_repo.py                    |  1 -
 Allura/allura/tests/test_decorators.py                    |  2 +-
 Allura/allura/tests/test_diff.py                          |  1 -
 Allura/allura/tests/test_globals.py                       |  3 ---
 Allura/allura/tests/test_helpers.py                       |  1 -
 Allura/allura/tests/test_mail_util.py                     |  1 -
 Allura/allura/tests/test_markdown.py                      |  1 -
 Allura/allura/tests/test_scripttask.py                    |  1 -
 Allura/allura/tests/test_security.py                      |  2 +-
 Allura/allura/tests/test_tasks.py                         |  1 -
 Allura/allura/tests/test_utils.py                         |  2 --
 Allura/allura/tests/test_webhooks.py                      |  1 -
 Allura/allura/tests/unit/spam/test_spam_filter.py         |  1 -
 Allura/allura/tests/unit/test_artifact.py                 |  1 -
 Allura/allura/tests/unit/test_project.py                  |  1 -
 Allura/allura/tests/unit/test_repo.py                     |  2 --
 Allura/allura/tests/unit/test_sitemapentry.py             |  1 -
 Allura/allura/tests/unit/test_solr.py                     |  1 -
 Allura/allura/webhooks.py                                 |  1 -
 Allura/allura/websetup/bootstrap.py                       |  4 ----
 Allura/allura/websetup/schema.py                          |  1 -
 AlluraTest/alluratest/controller.py                       |  5 +----
 AlluraTest/alluratest/tools.py                            |  2 --
 AlluraTest/alluratest/validation.py                       |  5 -----
 ForgeActivity/forgeactivity/main.py                       |  2 +-
 ForgeBlog/forgeblog/model/blog.py                         |  1 -
 ForgeBlog/forgeblog/tests/test_commands.py                |  3 ---
 ForgeDiscussion/forgediscussion/controllers/forum.py      |  1 -
 ForgeDiscussion/forgediscussion/controllers/root.py       |  2 +-
 ForgeDiscussion/forgediscussion/forum_main.py             |  1 -
 ForgeDiscussion/forgediscussion/import_support.py         |  1 -
 ForgeDiscussion/forgediscussion/model/forum.py            |  2 --
 .../forgediscussion/tests/functional/test_forum.py        |  1 -
 ForgeDiscussion/forgediscussion/widgets/forum_widgets.py  |  2 --
 ForgeFeedback/forgefeedback/feedback_main.py              |  5 ++---
 ForgeFeedback/forgefeedback/model/feedback.py             |  5 -----
 ForgeFeedback/forgefeedback/tests/functional/test_root.py |  4 ----
 ForgeFiles/forgefiles/files_main.py                       |  2 +-
 ForgeGit/forgegit/controllers.py                          |  2 +-
 ForgeGit/forgegit/tests/model/test_repository.py          |  1 -
 ForgeGit/forgegit/tests/test_git_app.py                   |  1 -
 ForgeGit/forgegit/tests/test_tasks.py                     |  1 -
 ForgeImporters/forgeimporters/github/tracker.py           |  1 -
 ForgeImporters/forgeimporters/github/wiki.py              |  1 -
 ForgeImporters/forgeimporters/trac/tests/test_tickets.py  |  2 +-
 ForgeSVN/forgesvn/controllers.py                          |  2 +-
 ForgeSVN/forgesvn/model/svn.py                            |  3 +--
 ForgeSVN/forgesvn/svn_main.py                             |  1 -
 ForgeSVN/forgesvn/tests/model/test_repository.py          |  1 -
 ForgeSVN/forgesvn/tests/test_svn_app.py                   |  1 -
 ForgeSVN/forgesvn/tests/test_tasks.py                     |  1 -
 ForgeShortUrl/forgeshorturl/model/shorturl.py             |  2 +-
 ForgeTracker/forgetracker/import_support.py               |  1 -
 ForgeTracker/forgetracker/model/ticket.py                 |  1 -
 ForgeTracker/forgetracker/plugins.py                      |  2 --
 ForgeTracker/forgetracker/search.py                       |  1 -
 ForgeTracker/forgetracker/tests/functional/test_root.py   |  4 ----
 .../forgetracker/tests/unit/test_root_controller.py       |  1 -
 ForgeTracker/forgetracker/tests/unit/test_ticket_model.py |  1 -
 ForgeTracker/forgetracker/widgets/ticket_form.py          |  1 -
 ForgeTracker/forgetracker/widgets/ticket_search.py        |  1 -
 ForgeUserStats/forgeuserstats/controllers/userstats.py    |  1 -
 ForgeUserStats/forgeuserstats/tests/test_model.py         |  1 -
 ForgeUserStats/forgeuserstats/tests/test_stats.py         |  1 -
 ForgeWiki/forgewiki/converters.py                         |  1 -
 ForgeWiki/forgewiki/model/wiki.py                         |  1 -
 run_tests                                                 |  1 -
 .../migrations/032-subscribe-merge-request-submitters.py  |  2 +-
 scripts/migrations/033-change-comment-anon-permissions.py |  5 ++---
 .../034-update_subscriptions_ticket_and_mr_titles.py      |  1 -
 scripts/perf/generate-projects.py                         |  1 -
 scripts/perf/load-up-forum.py                             |  7 +++----
 scripts/trac_import.py                                    |  1 -
 140 files changed, 49 insertions(+), 228 deletions(-)

diff --git a/Allura/allura/command/base.py b/Allura/allura/command/base.py
index de09018c9..cf495fbf4 100644
--- a/Allura/allura/command/base.py
+++ b/Allura/allura/command/base.py
@@ -18,7 +18,6 @@
 import os
 import logging
 
-import six
 import tg
 from paste.script import command
 from paste.deploy import appconfig
diff --git a/Allura/allura/command/create_trove_categories.py b/Allura/allura/command/create_trove_categories.py
index bdb9815b9..d17304047 100644
--- a/Allura/allura/command/create_trove_categories.py
+++ b/Allura/allura/command/create_trove_categories.py
@@ -25,7 +25,6 @@ from mock import patch, Mock
 from . import base
 
 from allura import model as M
-import six
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/command/reclone_repo.py b/Allura/allura/command/reclone_repo.py
index a25e8ca68..ff99336bc 100644
--- a/Allura/allura/command/reclone_repo.py
+++ b/Allura/allura/command/reclone_repo.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import warnings
 
 from tg import tmpl_context as c
 
diff --git a/Allura/allura/command/script.py b/Allura/allura/command/script.py
index a004d41fa..27b841de0 100644
--- a/Allura/allura/command/script.py
+++ b/Allura/allura/command/script.py
@@ -18,7 +18,6 @@
 import sys
 import os.path
 import cProfile
-import warnings
 
 from tg import tmpl_context as c
 import tg
diff --git a/Allura/allura/command/show_models.py b/Allura/allura/command/show_models.py
index b5d9d4300..6702ba990 100644
--- a/Allura/allura/command/show_models.py
+++ b/Allura/allura/command/show_models.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import sys
 from collections import defaultdict
 from contextlib import contextmanager
 from itertools import groupby
@@ -32,7 +31,6 @@ from allura.lib.exceptions import CompoundError
 from allura.lib import helpers as h
 from allura.lib import utils
 from . import base
-import six
 
 
 class ShowModelsCommand(base.Command):
diff --git a/Allura/allura/command/taskd.py b/Allura/allura/command/taskd.py
index 2268d0426..01d4b710d 100644
--- a/Allura/allura/command/taskd.py
+++ b/Allura/allura/command/taskd.py
@@ -20,7 +20,6 @@ import re
 import logging
 import os
 import time
-import six.moves.queue
 from contextlib import contextmanager
 from datetime import datetime, timedelta
 import signal
diff --git a/Allura/allura/config/app_cfg.py b/Allura/allura/config/app_cfg.py
index dd4b975ef..bf33f6ab0 100644
--- a/Allura/allura/config/app_cfg.py
+++ b/Allura/allura/config/app_cfg.py
@@ -50,7 +50,7 @@ from tg.support.converters import asint
 
 import allura
 # needed for tg.configuration to work
-from allura.lib import app_globals, helpers
+from allura.lib import helpers
 from allura.lib.package_path_loader import PackagePathLoader
 
 log = logging.getLogger(__name__)
diff --git a/Allura/allura/config/middleware.py b/Allura/allura/config/middleware.py
index ec3547274..19c8e3e3b 100644
--- a/Allura/allura/config/middleware.py
+++ b/Allura/allura/config/middleware.py
@@ -24,8 +24,6 @@ import pickle
 import re
 import warnings
 
-import six
-import tg
 import pkg_resources
 from tg import config
 from paste.deploy.converters import asbool, aslist, asint
@@ -38,7 +36,6 @@ from werkzeug.debug import DebuggedApplication
 import activitystream
 import ew
 import formencode
-import ming
 from ming.odm.middleware import MingMiddleware
 from beaker_session_jwt import JWTCookieSession
 
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index bcfa181e3..770281005 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -22,7 +22,6 @@ import os
 from base64 import b32encode
 from datetime import datetime
 import re
-import warnings
 from urllib.parse import urlparse, urljoin
 
 import bson
diff --git a/Allura/allura/controllers/basetest_project_root.py b/Allura/allura/controllers/basetest_project_root.py
index a110a962f..805c80a8e 100644
--- a/Allura/allura/controllers/basetest_project_root.py
+++ b/Allura/allura/controllers/basetest_project_root.py
@@ -27,12 +27,10 @@ from tg import TGController
 from paste.deploy.converters import asbool
 
 from allura.lib.security import require, require_authenticated, require_access, has_access
-from allura.lib import helpers as h
 from allura.lib import plugin
 from allura import model as M
 from .root import RootController
 from .project import ProjectController
-from .rest import RestController
 
 __all__ = ['RootController']
 
diff --git a/Allura/allura/controllers/discuss.py b/Allura/allura/controllers/discuss.py
index 0d732f43c..e5ed81f87 100644
--- a/Allura/allura/controllers/discuss.py
+++ b/Allura/allura/controllers/discuss.py
@@ -15,14 +15,13 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from urllib.parse import unquote, urlsplit, parse_qs
+from urllib.parse import unquote
 from datetime import datetime
 import logging
 
 import pymongo
 from tg import expose, redirect, validate, request, flash, response
-from tg.decorators import with_trailing_slash, without_trailing_slash, before_render, before_validate
-from decorator import decorator
+from tg.decorators import with_trailing_slash, without_trailing_slash
 
 from tg import tmpl_context as c, app_globals as g
 from webob import exc
@@ -44,7 +43,6 @@ from allura.lib.widgets import discuss as DW
 from allura.lib.widgets import form_fields as ffw
 
 from allura.model.auth import User
-from allura.model.artifact import ArtifactReference
 from .attachments import AttachmentsController, AttachmentController
 from .feed import FeedArgs, FeedController
 import six
diff --git a/Allura/allura/controllers/newforge.py b/Allura/allura/controllers/newforge.py
index bd0f389ce..68351fd3f 100644
--- a/Allura/allura/controllers/newforge.py
+++ b/Allura/allura/controllers/newforge.py
@@ -19,7 +19,7 @@ from io import BytesIO
 
 import six
 from tg import expose
-from tg.decorators import without_trailing_slash, with_trailing_slash
+from tg.decorators import without_trailing_slash
 from webob import exc
 
 from tg import app_globals as g
diff --git a/Allura/allura/controllers/project.py b/Allura/allura/controllers/project.py
index 9f5868dc7..86ba0a7b4 100644
--- a/Allura/allura/controllers/project.py
+++ b/Allura/allura/controllers/project.py
@@ -28,7 +28,6 @@ from tg.decorators import with_trailing_slash, without_trailing_slash
 from tg import tmpl_context as c, app_globals as g
 from paste.deploy.converters import asbool
 from webob import exc
-import jinja2
 import markupsafe
 import pymongo
 
@@ -49,7 +48,6 @@ from allura.lib.widgets import form_fields as ffw
 from allura.lib.widgets import project_list as plw
 from allura.lib import plugin, exceptions
 from .search import ProjectBrowseController
-from allura.ext.user_profile.user_main import UserProfileApp
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 8138fd57b..111ba510a 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -15,13 +15,11 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import os
 import logging
 import difflib
 
 from allura.lib.utils import permanent_redirect
-from datetime import datetime
-from urllib.parse import quote, unquote
+from urllib.parse import unquote
 from collections import defaultdict, OrderedDict
 
 
diff --git a/Allura/allura/controllers/rest.py b/Allura/allura/controllers/rest.py
index e0b54fd16..82a39e1f4 100644
--- a/Allura/allura/controllers/rest.py
+++ b/Allura/allura/controllers/rest.py
@@ -20,7 +20,7 @@ from __future__ import annotations
 import json
 import logging
 from datetime import datetime, timedelta
-from urllib.parse import unquote, urlparse, parse_qs, parse_qsl
+from urllib.parse import unquote, parse_qs
 
 import oauthlib.oauth1
 import oauthlib.oauth2
@@ -31,7 +31,6 @@ import tg
 from tg import expose, flash, redirect, config
 from tg import tmpl_context as c, app_globals as g
 from tg import request, response
-from tg.decorators import without_trailing_slash
 import colander
 from ming.odm import session
 
diff --git a/Allura/allura/controllers/root.py b/Allura/allura/controllers/root.py
index c626ddf4e..fd0337538 100644
--- a/Allura/allura/controllers/root.py
+++ b/Allura/allura/controllers/root.py
@@ -19,7 +19,7 @@
 import logging
 from string import Template
 
-from tg import expose, request, config, session, redirect, flash
+from tg import expose, request, redirect, flash
 from tg.decorators import with_trailing_slash
 from tg import tmpl_context as c
 from tg import response
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 19ed71e4a..ca1e845b2 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -20,7 +20,7 @@ import logging
 from datetime import datetime, timedelta
 import shlex
 
-from tg import expose, validate, flash, config, redirect
+from tg import expose, validate, flash, redirect
 from tg.decorators import with_trailing_slash, without_trailing_slash
 import bson
 import tg
diff --git a/Allura/allura/controllers/trovecategories.py b/Allura/allura/controllers/trovecategories.py
index d94d60e42..971da330c 100644
--- a/Allura/allura/controllers/trovecategories.py
+++ b/Allura/allura/controllers/trovecategories.py
@@ -31,7 +31,6 @@ from allura.lib.security import require_authenticated, require_site_admin
 from allura.lib.widgets import forms
 from allura.lib.plugin import SiteAdminExtension
 from allura.app import SitemapEntry
-import six
 
 
 class F:
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 6feecd038..e5620aafb 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -18,7 +18,6 @@
 import logging
 import re
 import os
-from random import randint
 from collections import OrderedDict
 from datetime import datetime
 from urllib.parse import urlparse
@@ -26,7 +25,7 @@ import json
 from operator import itemgetter, attrgetter
 import pkg_resources
 
-from tg import tmpl_context as c, app_globals as g, response
+from tg import tmpl_context as c, app_globals as g
 from tg import request
 from paste.deploy.converters import asbool, aslist
 from tg import expose, redirect, flash, validate, config, jsonify
@@ -35,13 +34,12 @@ from webob import exc
 from bson import ObjectId
 from ming.odm.odmsession import ThreadLocalODMSession
 from ming.odm import session
-import PIL
 
 from allura.app import Application, DefaultAdminController, SitemapEntry
 from allura.lib import helpers as h
 from allura import version
 from allura import model as M
-from allura.lib.security import has_access, require_access, is_site_admin
+from allura.lib.security import has_access, require_access
 from allura.lib.widgets import form_fields as ffw
 from allura.lib import exceptions as forge_exc
 from allura.lib import plugin
diff --git a/Allura/allura/ext/admin/widgets.py b/Allura/allura/ext/admin/widgets.py
index e5537f467..2e1dfba23 100644
--- a/Allura/allura/ext/admin/widgets.py
+++ b/Allura/allura/ext/admin/widgets.py
@@ -14,7 +14,6 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-import tg
 from tg import tmpl_context as c
 
 import ew as ew_core
@@ -28,7 +27,6 @@ from allura.lib.widgets import forms as ff
 from allura.lib.widgets import form_fields as ffw
 
 from bson import ObjectId
-from paste.deploy.converters import aslist
 
 
 class CardField(ew._Jinja2Widget):
diff --git a/Allura/allura/ext/user_profile/user_main.py b/Allura/allura/ext/user_profile/user_main.py
index cf7840523..635693e8d 100644
--- a/Allura/allura/ext/user_profile/user_main.py
+++ b/Allura/allura/ext/user_profile/user_main.py
@@ -27,7 +27,6 @@ from tg import tmpl_context as c, app_globals as g
 from pytz import timezone
 from tg import expose, redirect, validate, flash
 from tg.decorators import without_trailing_slash
-from decorator import decorator
 from webob import exc
 
 from allura import version
@@ -40,7 +39,7 @@ from allura.lib.decorators import require_post
 from allura.lib.plugin import AuthenticationProvider
 from allura.lib.security import require_access
 from allura.lib.widgets.user_profile import SendMessageForm, SectionsUtil, SectionBase, ProjectsSectionBase
-from allura.model import User, ACE, ProjectRole
+from allura.model import ACE, ProjectRole
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/lib/app_globals.py b/Allura/allura/lib/app_globals.py
index fc6bfbba9..0870579f8 100644
--- a/Allura/allura/lib/app_globals.py
+++ b/Allura/allura/lib/app_globals.py
@@ -18,11 +18,9 @@ from __future__ import annotations
 
 import re
 import logging
-import html
 import hashlib
 import json
 import datetime
-from urllib.parse import urlencode
 from subprocess import Popen, PIPE
 import os
 import time
@@ -63,7 +61,6 @@ from allura.lib.macro import uncacheable_macros_names
 from allura.lib.widgets import analytics
 from allura.lib.security import Credentials
 from allura.lib.solr import MockSOLR, make_solr_from_config
-from allura.model.session import artifact_orm_session
 import six
 
 """The application's Globals object"""
diff --git a/Allura/allura/lib/custom_middleware.py b/Allura/allura/lib/custom_middleware.py
index f73036d16..0e8c0392a 100644
--- a/Allura/allura/lib/custom_middleware.py
+++ b/Allura/allura/lib/custom_middleware.py
@@ -34,7 +34,7 @@ from allura.lib import helpers as h
 from allura.lib.utils import is_ajax
 from allura import model as M
 import allura.model.repository
-from tg import tmpl_context as c, app_globals as g
+from tg import tmpl_context as c
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/lib/decorators.py b/Allura/allura/lib/decorators.py
index a0fecc1f4..cd27647b4 100644
--- a/Allura/allura/lib/decorators.py
+++ b/Allura/allura/lib/decorators.py
@@ -16,10 +16,8 @@
 #       under the License.
 
 import inspect
-import sys
 import json
 import logging
-import six
 from http.cookies import SimpleCookie as Cookie
 from collections import defaultdict
 from urllib.parse import unquote
@@ -38,7 +36,6 @@ from tg import response
 from webob.exc import HTTPFound, WSGIHTTPException
 
 from allura.lib import helpers as h
-from allura.lib import utils
 
 
 log = logging.getLogger(__name__)
diff --git a/Allura/allura/lib/diff.py b/Allura/allura/lib/diff.py
index ee9087253..e9f7b60e8 100644
--- a/Allura/allura/lib/diff.py
+++ b/Allura/allura/lib/diff.py
@@ -19,7 +19,7 @@ from __future__ import annotations
 import html
 import contextlib
 import logging
-from collections.abc import Iterable, Generator
+from collections.abc import Iterable
 
 import sxsdiff
 from diff_match_patch import diff_match_patch
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index 4ac03e2ae..8631f09ca 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -21,7 +21,6 @@ import sys
 import os
 import os.path
 import difflib
-import jinja2
 
 import urllib.request
 import urllib.parse
@@ -32,13 +31,11 @@ import json
 import logging
 import string
 import random
-import pickle
 from hashlib import sha1
 from datetime import datetime, timedelta
-from collections import defaultdict, OrderedDict
+from collections import defaultdict
 import shlex
 import socket
-from functools import partial
 from io import BytesIO
 import html
 import http.client
@@ -60,10 +57,12 @@ from tg.decorators import before_validate
 from formencode.variabledecode import variable_decode
 import formencode
 from markupsafe import Markup
-from jinja2.filters import escape, do_filesizeformat
+from jinja2.filters import escape
+from jinja2.filters import do_filesizeformat  # noqa: F401 RUF100
 from jinja2.utils import pass_context, htmlsafe_json_dumps
 from paste.deploy.converters import asbool, aslist, asint
-from webhelpers2 import date, text
+from webhelpers2 import date
+from webhelpers2 import text  # noqa: F401 RUF100
 from webob.exc import HTTPUnauthorized
 
 from allura.lib import exceptions as exc
@@ -72,10 +71,9 @@ from allura.lib import validators
 import urllib.parse as urlparse
 from urllib.parse import urlencode
 import math
-from webob.multidict import MultiDict
 
 # import to make available to templates, don't delete:
-from .security import has_access, is_allowed_by_role, is_site_admin
+from .security import has_access, is_allowed_by_role, is_site_admin  # noqa: F401 RUF100
 
 
 log = logging.getLogger(__name__)
@@ -955,7 +953,6 @@ def ming_config(**conf):
     :param \*\*conf: keyword arguments defining the new ming configuration
 
     """
-    import ming
     from ming.session import Session
     datastores = Session._datastores
     try:
diff --git a/Allura/allura/lib/macro.py b/Allura/allura/lib/macro.py
index f0e32e150..711bd3de4 100644
--- a/Allura/allura/lib/macro.py
+++ b/Allura/allura/lib/macro.py
@@ -29,7 +29,6 @@ import six.moves.urllib.request
 import six.moves.urllib.error
 
 import oembed
-import jinja2
 import markupsafe
 from operator import attrgetter
 from urllib.parse import urlparse, urlunparse
diff --git a/Allura/allura/lib/markdown_extensions.py b/Allura/allura/lib/markdown_extensions.py
index a942e8ba4..28ffd13aa 100644
--- a/Allura/allura/lib/markdown_extensions.py
+++ b/Allura/allura/lib/markdown_extensions.py
@@ -19,7 +19,6 @@ from __future__ import annotations
 import re
 import logging
 import warnings
-from typing import List
 import xml.etree.ElementTree as etree
 
 from urllib.parse import urljoin
@@ -37,7 +36,6 @@ from . import macro
 from . import helpers as h
 from allura import model as M
 from allura.lib.utils import ForgeHTMLSanitizerFilter, is_nofollow_url
-import six
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/lib/multifactor.py b/Allura/allura/lib/multifactor.py
index c80465501..8368497b6 100644
--- a/Allura/allura/lib/multifactor.py
+++ b/Allura/allura/lib/multifactor.py
@@ -24,7 +24,6 @@ from collections import OrderedDict
 from base64 import b32decode, b32encode
 from time import time
 import errno
-import warnings
 
 import bson
 from allura.lib.exceptions import InvalidRecoveryCode, MultifactorRateLimitError
diff --git a/Allura/allura/lib/patches.py b/Allura/allura/lib/patches.py
index 964624d0b..d8d642394 100644
--- a/Allura/allura/lib/patches.py
+++ b/Allura/allura/lib/patches.py
@@ -15,17 +15,13 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import re
 
 import webob
 import tg.decorators
 from decorator import decorator
 from tg import request
-import mock
-import json
 
 from allura.lib import helpers as h
-import six
 
 _patched = False
 def apply():
diff --git a/Allura/allura/lib/phone/nexmo.py b/Allura/allura/lib/phone/nexmo.py
index fa1443eb7..9ac4829f7 100644
--- a/Allura/allura/lib/phone/nexmo.py
+++ b/Allura/allura/lib/phone/nexmo.py
@@ -21,7 +21,6 @@ import html
 import json
 
 import requests
-import jinja2
 import markupsafe
 
 from allura.lib.phone import PhoneService
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index c836378a6..fa059bd38 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -24,8 +24,6 @@ import os
 import logging
 import subprocess
 import string
-import random
-import sys
 import warnings
 from contextlib import contextmanager
 from urllib.parse import urlparse
@@ -49,7 +47,7 @@ except ImportError:
     ldap = modlist = None
 import pkg_resources
 import tg
-from tg import config, request, redirect, response, flash
+from tg import config, request, redirect, response
 from tg import tmpl_context as c, app_globals as g
 from webob import exc, Request
 from paste.deploy.converters import asbool, asint, aslist
diff --git a/Allura/allura/lib/project_create_helpers.py b/Allura/allura/lib/project_create_helpers.py
index 387eb0f68..2ec2cb3f7 100644
--- a/Allura/allura/lib/project_create_helpers.py
+++ b/Allura/allura/lib/project_create_helpers.py
@@ -29,11 +29,9 @@ import colander as col
 import bson
 import requests
 import formencode
-import six
 from urllib.parse import urlparse
 
 from allura.lib.helpers import slugify
-from allura.model import Neighborhood
 from ming.base import Object
 from ming.odm import ThreadLocalODMSession
 from tg import tmpl_context as c, app_globals as g
diff --git a/Allura/allura/lib/repository.py b/Allura/allura/lib/repository.py
index d4d21ff9f..f76374bc9 100644
--- a/Allura/allura/lib/repository.py
+++ b/Allura/allura/lib/repository.py
@@ -18,7 +18,6 @@
 import logging
 
 import six
-from urllib.parse import quote
 
 from tg import tmpl_context as c, app_globals as g
 from tg import request
diff --git a/Allura/allura/lib/search.py b/Allura/allura/lib/search.py
index 0489f1ac2..69531f5e9 100644
--- a/Allura/allura/lib/search.py
+++ b/Allura/allura/lib/search.py
@@ -18,13 +18,11 @@
 
 import ast
 import re
-import socket
 from logging import getLogger
 
 
 import bson
 import markdown
-import jinja2
 import markupsafe
 from tg import redirect, url
 from tg import tmpl_context as c, app_globals as g
@@ -34,7 +32,6 @@ from pysolr import SolrError
 from allura.lib import helpers as h
 from allura.lib.solr import escape_solr_arg
 from allura.lib.utils import urlencode
-import six
 
 log = getLogger(__name__)
 
diff --git a/Allura/allura/lib/solr.py b/Allura/allura/lib/solr.py
index 012fb728a..49511d8aa 100644
--- a/Allura/allura/lib/solr.py
+++ b/Allura/allura/lib/solr.py
@@ -26,7 +26,6 @@ from webob.exc import HTTPRequestEntityTooLarge
 from paste.deploy.converters import asbool
 import pysolr
 from pysolr import SolrError
-import six
 
 from allura.lib.helpers import shlex_split
 
diff --git a/Allura/allura/lib/spam/stopforumspamfilter.py b/Allura/allura/lib/spam/stopforumspamfilter.py
index 80d234c9e..dc240ce34 100644
--- a/Allura/allura/lib/spam/stopforumspamfilter.py
+++ b/Allura/allura/lib/spam/stopforumspamfilter.py
@@ -24,7 +24,6 @@ from tg import request
 
 from allura.lib import utils
 from allura.lib.spam import SpamFilter
-import six
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index d025f4f67..d3b27fd6b 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -20,7 +20,6 @@ import base64
 from collections.abc import Iterable, Mapping, MutableMapping
 from contextlib import contextmanager
 import time
-import string
 import hashlib
 import binascii
 import logging.handlers
@@ -29,11 +28,10 @@ import datetime
 import random
 import mimetypes
 import re
-from typing import Type, TypeVar
+from typing import TypeVar
 import magic
 from itertools import groupby
 import operator as op
-import collections
 import ming
 from urllib.parse import urlparse
 import six.moves.urllib.request
diff --git a/Allura/allura/lib/validators.py b/Allura/allura/lib/validators.py
index 9bce7b396..1a949d7e0 100644
--- a/Allura/allura/lib/validators.py
+++ b/Allura/allura/lib/validators.py
@@ -23,7 +23,6 @@ from formencode import validators as fev
 from tg import tmpl_context as c
 from . import helpers as h
 from datetime import datetime
-import six
 from urllib.parse import urlsplit
 from ipaddress import ip_address
 import socket
diff --git a/Allura/allura/lib/widgets/auth_widgets.py b/Allura/allura/lib/widgets/auth_widgets.py
index 52a849fc9..1382545cb 100644
--- a/Allura/allura/lib/widgets/auth_widgets.py
+++ b/Allura/allura/lib/widgets/auth_widgets.py
@@ -21,14 +21,12 @@ from ew.core import validator
 
 from tg import request, tmpl_context as c
 from formencode import Invalid
-from formencode import validators as fev
 from webob import exc
 
 from .forms import ForgeForm
 from tg import tmpl_context as c, app_globals as g
 
 from allura.lib import plugin
-from allura import model as M
 
 
 class LoginForm(ForgeForm):
diff --git a/Allura/allura/lib/widgets/form_fields.py b/Allura/allura/lib/widgets/form_fields.py
index d2347daca..646c98180 100644
--- a/Allura/allura/lib/widgets/form_fields.py
+++ b/Allura/allura/lib/widgets/form_fields.py
@@ -23,12 +23,10 @@ from tg import request, url
 import json
 import logging
 
-from formencode import validators as fev
 import paginate
 
 import ew as ew_core
 import ew.jinja2_ew as ew
-import six
 
 from allura.lib import validators as v
 
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index d3c8ddff8..cc3744feb 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -16,7 +16,6 @@
 #       under the License.
 
 import logging
-from html import escape as html_escape
 
 import html
 from tg import app_globals as g, tmpl_context as c
diff --git a/Allura/allura/lib/widgets/oauth_widgets.py b/Allura/allura/lib/widgets/oauth_widgets.py
index ba314c3d0..7fe33b75e 100644
--- a/Allura/allura/lib/widgets/oauth_widgets.py
+++ b/Allura/allura/lib/widgets/oauth_widgets.py
@@ -17,7 +17,6 @@
 
 import ew as ew_core
 import ew.jinja2_ew as ew
-from formencode import validators as fev
 
 from allura.lib import validators as V
 
diff --git a/Allura/allura/lib/widgets/project_list.py b/Allura/allura/lib/widgets/project_list.py
index 01bc4e2f3..b91d2dd84 100644
--- a/Allura/allura/lib/widgets/project_list.py
+++ b/Allura/allura/lib/widgets/project_list.py
@@ -23,7 +23,6 @@ from paste.deploy.converters import asbool
 
 from allura import model as M
 from allura.lib.security import Credentials
-import six
 
 
 class ProjectSummary(ew_core.Widget):
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 0758a9569..32c126daa 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -47,7 +47,6 @@ from .project import AppConfig
 from .notification import MailFooter
 
 from .filesystem import File
-import six
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 607a4b5cb..51dc98617 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -18,10 +18,8 @@
 from __future__ import annotations
 
 import logging
-import calendar
 import typing
 
-import six
 from markupsafe import Markup
 from urllib.parse import urlparse
 from email import header
@@ -38,7 +36,6 @@ from tg import config
 from tg import tmpl_context as c, app_globals as g
 from tg import request
 from ming import schema as S
-from ming import Field
 from ming.odm import session, state
 from ming.odm import FieldProperty, RelationProperty, ForeignIdProperty
 from ming.odm.declarative import MappedClass
@@ -52,7 +49,6 @@ from allura.lib import utils
 from allura.lib.decorators import memoize
 from allura.lib.search import SearchIndexable
 from .session import main_orm_session, main_explicitflush_orm_session
-from .session import project_orm_session
 from .timeline import ActivityNode, ActivityObject
 
 
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 2199ecdd4..6cb0b6ef3 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -20,12 +20,10 @@ import logging
 from datetime import datetime
 import typing
 
-import jinja2
 import markupsafe
 import pymongo
 from pymongo.errors import DuplicateKeyError
 from tg import tmpl_context as c, app_globals as g
-import tg
 
 from ming import schema
 from ming.odm.base import session
diff --git a/Allura/allura/model/index.py b/Allura/allura/model/index.py
index c778db3b3..50b33999f 100644
--- a/Allura/allura/model/index.py
+++ b/Allura/allura/model/index.py
@@ -39,7 +39,6 @@ from allura.lib import helpers as h
 
 from .session import main_orm_session
 from .project import Project
-import six
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
diff --git a/Allura/allura/model/monq_model.py b/Allura/allura/model/monq_model.py
index 4dbc532dc..2e2bc9466 100644
--- a/Allura/allura/model/monq_model.py
+++ b/Allura/allura/model/monq_model.py
@@ -23,7 +23,7 @@ from datetime import datetime, timedelta
 import typing
 
 import pymongo
-from tg import tmpl_context as c, app_globals as g
+from tg import tmpl_context as c
 from tg import config
 from paste.deploy.converters import asbool
 
diff --git a/Allura/allura/model/neighborhood.py b/Allura/allura/model/neighborhood.py
index 9487518a3..60b38ea31 100644
--- a/Allura/allura/model/neighborhood.py
+++ b/Allura/allura/model/neighborhood.py
@@ -27,7 +27,7 @@ from ming.odm.declarative import MappedClass
 from ming.utils import LazyProperty
 
 from tg import request
-from tg import tmpl_context as c, app_globals as g
+from tg import tmpl_context as c
 
 from allura.lib import plugin
 
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index 5b08cf1e8..a8b5a7625 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -35,7 +35,6 @@ Periodically:
 '''
 
 import logging
-from allura.lib.decorators import memoize
 from bson import ObjectId
 from datetime import datetime, timedelta
 from collections import defaultdict
@@ -58,7 +57,6 @@ import allura.tasks.mail_tasks
 
 from .session import main_orm_session
 from .auth import User, AlluraUserProperty
-import six
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
diff --git a/Allura/allura/model/repo_refresh.py b/Allura/allura/model/repo_refresh.py
index 91b724568..e5dbbbea2 100644
--- a/Allura/allura/model/repo_refresh.py
+++ b/Allura/allura/model/repo_refresh.py
@@ -22,9 +22,9 @@ import bson
 import tg
 import jinja2
 from paste.deploy.converters import asint
-from tg import tmpl_context as c, app_globals as g
+from tg import app_globals as g
 
-from ming.odm import mapper, session, ThreadLocalODMSession
+from ming.odm import session
 from ming.odm.base import ObjectState, state
 
 from allura.lib import utils
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 06128afab..b39ca28f1 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -48,7 +48,7 @@ from ming import schema as S
 from ming.odm import session
 from ming import Field, collection, Index
 from ming.utils import LazyProperty
-from ming.odm import FieldProperty, session, Mapper, mapper, MappedClass, RelationProperty
+from ming.odm import FieldProperty, session, Mapper, MappedClass, RelationProperty
 from ming.base import Object
 
 from allura.lib import helpers as h
diff --git a/Allura/allura/model/session.py b/Allura/allura/model/session.py
index 15558dabe..2752afa46 100644
--- a/Allura/allura/model/session.py
+++ b/Allura/allura/model/session.py
@@ -24,7 +24,6 @@ from ming.odm.base import ObjectState
 from ming.odm.base import state
 from ming.odm.odmsession import ThreadLocalODMSession, SessionExtension
 from contextlib import contextmanager
-from tg import tmpl_context as c
 
 from allura.lib.utils import chunked_list
 from allura.tasks import index_tasks
@@ -117,7 +116,6 @@ class ArtifactSessionExtension(ManagedSessionExtension):
     def after_flush(self, obj=None):
         "Update artifact references, and add/update this artifact to solr"
         if not getattr(self.session, 'disable_index', False):
-            from tg import app_globals as g
             from .index import ArtifactReference, Shortlink
             from .session import main_orm_session
             # Ensure artifact references & shortlinks exist for new objects
diff --git a/Allura/allura/model/webhook.py b/Allura/allura/model/webhook.py
index 34d39ac9c..1be2797e3 100644
--- a/Allura/allura/model/webhook.py
+++ b/Allura/allura/model/webhook.py
@@ -25,7 +25,6 @@ from tg import config
 
 from allura.model import Artifact
 from allura.lib import helpers as h
-import six
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
diff --git a/Allura/allura/scripts/reindex_projects.py b/Allura/allura/scripts/reindex_projects.py
index 41b9d47c5..305b0571f 100644
--- a/Allura/allura/scripts/reindex_projects.py
+++ b/Allura/allura/scripts/reindex_projects.py
@@ -19,7 +19,7 @@ import argparse
 import logging
 
 from pymongo.errors import InvalidDocument
-from tg import tmpl_context as c, app_globals as g
+from tg import tmpl_context as c
 
 from allura.scripts import ScriptTask
 from allura import model as M
diff --git a/Allura/allura/tasks/event_tasks.py b/Allura/allura/tasks/event_tasks.py
index 3bed9a0b2..213ef09cf 100644
--- a/Allura/allura/tasks/event_tasks.py
+++ b/Allura/allura/tasks/event_tasks.py
@@ -19,7 +19,6 @@ import sys
 
 from allura.lib.decorators import task, event_handler
 from allura.lib.exceptions import CompoundError
-import six
 
 
 @task
diff --git a/Allura/allura/tasks/export_tasks.py b/Allura/allura/tasks/export_tasks.py
index 13bb6f44a..0c83b734a 100644
--- a/Allura/allura/tasks/export_tasks.py
+++ b/Allura/allura/tasks/export_tasks.py
@@ -25,7 +25,6 @@ from tg import app_globals as g, tmpl_context as c
 
 from allura.tasks import mail_tasks
 from allura.lib.decorators import task
-from allura.lib import helpers as h
 from allura.model.repository import zipdir
 
 
diff --git a/Allura/allura/tasks/index_tasks.py b/Allura/allura/tasks/index_tasks.py
index d907b3319..b1cab900a 100644
--- a/Allura/allura/tasks/index_tasks.py
+++ b/Allura/allura/tasks/index_tasks.py
@@ -30,7 +30,6 @@ from allura.lib import helpers as h
 from allura.lib.decorators import task
 from allura.lib.exceptions import CompoundError
 from allura.lib.solr import make_solr_from_config
-import six
 
 if typing.TYPE_CHECKING:
     import pysolr
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index b0f24bf5f..e7855d655 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -24,7 +24,6 @@ from ming.odm import session
 
 from allura.lib.decorators import task
 from allura.lib.repository import RepositoryApp
-from allura.lib.utils import skip_mod_date
 import git
 from git import SymbolicReference
 
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index d862c7a8e..a30f938b2 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -34,11 +34,11 @@ from mock import patch, Mock
 import mock
 import pytest
 import webtest
-from tg import tmpl_context as c, app_globals as g
+from tg import tmpl_context as c
 
 from allura.tests import TestController
 from allura.tests import decorators as td
-from allura.tests.decorators import audits, out_audits, assert_logmsg
+from allura.tests.decorators import audits, out_audits
 from alluratest.controller import setup_trove_categories, TestRestApiBase, oauth1_webtest
 from allura import model as M
 from allura.model.oauth import dummy_oauths
diff --git a/Allura/allura/tests/functional/test_discuss.py b/Allura/allura/tests/functional/test_discuss.py
index 0b88c576d..13935414b 100644
--- a/Allura/allura/tests/functional/test_discuss.py
+++ b/Allura/allura/tests/functional/test_discuss.py
@@ -17,8 +17,6 @@
 
 import os
 from mock import patch
-import pytest
-from webtest.app import AppError
 from ming.odm import session
 
 from allura.tests import TestController
diff --git a/Allura/allura/tests/functional/test_rest.py b/Allura/allura/tests/functional/test_rest.py
index 21d260254..a5ceaeaae 100644
--- a/Allura/allura/tests/functional/test_rest.py
+++ b/Allura/allura/tests/functional/test_rest.py
@@ -19,7 +19,6 @@
 import json
 from datetime import datetime, timedelta
 
-import tg
 from bson import ObjectId
 from tg import app_globals as g
 import mock
diff --git a/Allura/allura/tests/functional/test_root.py b/Allura/allura/tests/functional/test_root.py
index 8dfbe0dd7..d11568388 100644
--- a/Allura/allura/tests/functional/test_root.py
+++ b/Allura/allura/tests/functional/test_root.py
@@ -27,7 +27,6 @@ Please read http://pythonpaste.org/webtest/ for more information.
 
 """
 import os
-import re
 from unittest import skipIf
 
 import pytest
diff --git a/Allura/allura/tests/functional/test_site_admin.py b/Allura/allura/tests/functional/test_site_admin.py
index 7a017f7af..78e775904 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -18,7 +18,6 @@
 import json
 import datetime as dt
 import bson
-import pytest
 
 from mock import patch, MagicMock
 from ming.odm import ThreadLocalODMSession
diff --git a/Allura/allura/tests/model/test_auth.py b/Allura/allura/tests/model/test_auth.py
index 4f6e708e4..3a6ece759 100644
--- a/Allura/allura/tests/model/test_auth.py
+++ b/Allura/allura/tests/model/test_auth.py
@@ -33,7 +33,7 @@ from allura import model as M
 from allura.lib import helpers as h
 from allura.lib import plugin
 from allura.tests import decorators as td
-from alluratest.controller import setup_basic_test, setup_global_objects, setup_functional_test, setup_unit_test
+from alluratest.controller import setup_basic_test, setup_global_objects, setup_functional_test
 
 
 class TestAuth:
diff --git a/Allura/allura/tests/model/test_notification.py b/Allura/allura/tests/model/test_notification.py
index ba502823e..42b14728c 100644
--- a/Allura/allura/tests/model/test_notification.py
+++ b/Allura/allura/tests/model/test_notification.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 from datetime import timedelta
 import collections
 
diff --git a/Allura/allura/tests/model/test_repo.py b/Allura/allura/tests/model/test_repo.py
index f1f57af8f..7434f4b1b 100644
--- a/Allura/allura/tests/model/test_repo.py
+++ b/Allura/allura/tests/model/test_repo.py
@@ -18,7 +18,6 @@
 from datetime import datetime
 from collections import defaultdict, OrderedDict
 
-import unittest
 import mock
 import pytest
 from tg import tmpl_context as c
diff --git a/Allura/allura/tests/test_decorators.py b/Allura/allura/tests/test_decorators.py
index 607833303..638f365d7 100644
--- a/Allura/allura/tests/test_decorators.py
+++ b/Allura/allura/tests/test_decorators.py
@@ -20,7 +20,7 @@ import random
 import gc
 
 from allura.lib.decorators import task, memoize
-from alluratest.controller import setup_basic_test, setup_global_objects
+from alluratest.controller import setup_basic_test
 
 
 class TestTask:
diff --git a/Allura/allura/tests/test_diff.py b/Allura/allura/tests/test_diff.py
index 153f37798..0d528af68 100644
--- a/Allura/allura/tests/test_diff.py
+++ b/Allura/allura/tests/test_diff.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 
 from allura.lib.diff import HtmlSideBySideDiff
 
diff --git a/Allura/allura/tests/test_globals.py b/Allura/allura/tests/test_globals.py
index e8f349a73..c88623c5d 100644
--- a/Allura/allura/tests/test_globals.py
+++ b/Allura/allura/tests/test_globals.py
@@ -22,9 +22,7 @@ from textwrap import dedent
 import pytest
 
 import allura
-import unittest
 import hashlib
-import six
 from mock import patch, Mock
 
 from bson import ObjectId
@@ -37,7 +35,6 @@ from alluratest.controller import (
     setup_basic_test,
     setup_global_objects,
     setup_unit_test,
-    setup_functional_test,
     setup_trove_categories,
 )
 
diff --git a/Allura/allura/tests/test_helpers.py b/Allura/allura/tests/test_helpers.py
index 050de3239..817abde69 100644
--- a/Allura/allura/tests/test_helpers.py
+++ b/Allura/allura/tests/test_helpers.py
@@ -42,7 +42,6 @@ from allura.lib.security import has_access
 from allura.lib.security import Credentials
 from allura.tests import decorators as td
 from alluratest.controller import setup_basic_test
-import six
 
 # httpbin.org should work, but lately has been unreliable
 # httpbin.io does not allow /redirect-to to localhost
diff --git a/Allura/allura/tests/test_mail_util.py b/Allura/allura/tests/test_mail_util.py
index f32b07387..c549e5a01 100644
--- a/Allura/allura/tests/test_mail_util.py
+++ b/Allura/allura/tests/test_mail_util.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 
diff --git a/Allura/allura/tests/test_markdown.py b/Allura/allura/tests/test_markdown.py
index f86506e6c..3e56fe81e 100644
--- a/Allura/allura/tests/test_markdown.py
+++ b/Allura/allura/tests/test_markdown.py
@@ -102,7 +102,6 @@ class TestCommitMessageExtension:
     @mock.patch('allura.lib.markdown_extensions.TracRef2.get_comment_slug')
     @mock.patch('allura.lib.markdown_extensions.M.Shortlink.lookup')
     def test_convert(self, lookup, get_comment_slug):
-        from allura.lib.app_globals import ForgeMarkdown
 
         shortlink = mock.Mock(url='/p/project/tool/artifact/')
         shortlink.ref.artifact.deleted = False
diff --git a/Allura/allura/tests/test_scripttask.py b/Allura/allura/tests/test_scripttask.py
index edbfda5cf..48a4205f3 100644
--- a/Allura/allura/tests/test_scripttask.py
+++ b/Allura/allura/tests/test_scripttask.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 import mock
 
 from allura.scripts.scripttask import ScriptTask
diff --git a/Allura/allura/tests/test_security.py b/Allura/allura/tests/test_security.py
index a1413583f..efa07b0f4 100644
--- a/Allura/allura/tests/test_security.py
+++ b/Allura/allura/tests/test_security.py
@@ -26,7 +26,7 @@ from allura.lib.security import Credentials, all_allowed, has_access
 from allura import model as M
 from forgewiki import model as WM
 from allura.lib.security import HIBPClientError, HIBPClient
-from mock import Mock, patch
+from mock import patch
 from requests.exceptions import Timeout
 
 
diff --git a/Allura/allura/tests/test_tasks.py b/Allura/allura/tests/test_tasks.py
index 81fb4123d..0d953f0c6 100644
--- a/Allura/allura/tests/test_tasks.py
+++ b/Allura/allura/tests/test_tasks.py
@@ -19,7 +19,6 @@ import email.iterators
 import operator
 import shutil
 from textwrap import dedent
-import unittest
 
 import six
 from base64 import b64encode
diff --git a/Allura/allura/tests/test_utils.py b/Allura/allura/tests/test_utils.py
index 8878ea21a..64d02c59b 100644
--- a/Allura/allura/tests/test_utils.py
+++ b/Allura/allura/tests/test_utils.py
@@ -17,11 +17,9 @@
 
 import json
 import time
-import unittest
 import datetime as dt
 from os import path
 
-import six
 import ming
 from ming.odm import session
 from bson import ObjectId
diff --git a/Allura/allura/tests/test_webhooks.py b/Allura/allura/tests/test_webhooks.py
index 76b78a076..d0bbd83e2 100644
--- a/Allura/allura/tests/test_webhooks.py
+++ b/Allura/allura/tests/test_webhooks.py
@@ -42,7 +42,6 @@ from alluratest.controller import (
     TestController,
     TestRestApiBase,
 )
-import six
 
 
 # important to be distinct from 'test' and 'test2' which ForgeGit and
diff --git a/Allura/allura/tests/unit/spam/test_spam_filter.py b/Allura/allura/tests/unit/spam/test_spam_filter.py
index f2977fe8f..f9f758164 100644
--- a/Allura/allura/tests/unit/spam/test_spam_filter.py
+++ b/Allura/allura/tests/unit/spam/test_spam_filter.py
@@ -16,7 +16,6 @@
 #       under the License.
 
 import mock
-import unittest
 
 from ming.odm import ThreadLocalODMSession
 
diff --git a/Allura/allura/tests/unit/test_artifact.py b/Allura/allura/tests/unit/test_artifact.py
index 470d21034..bac61bfd7 100644
--- a/Allura/allura/tests/unit/test_artifact.py
+++ b/Allura/allura/tests/unit/test_artifact.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 
 from allura import model as M
 
diff --git a/Allura/allura/tests/unit/test_project.py b/Allura/allura/tests/unit/test_project.py
index 125022e06..ef1c1d9c2 100644
--- a/Allura/allura/tests/unit/test_project.py
+++ b/Allura/allura/tests/unit/test_project.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 from mock import Mock
 
 from tg import config
diff --git a/Allura/allura/tests/unit/test_repo.py b/Allura/allura/tests/unit/test_repo.py
index e9983a580..6d177a2f0 100644
--- a/Allura/allura/tests/unit/test_repo.py
+++ b/Allura/allura/tests/unit/test_repo.py
@@ -16,10 +16,8 @@
 #       under the License.
 
 import datetime
-import unittest
 
 import pytest
-import six
 from mock import patch, Mock, MagicMock, call
 
 from tg import tmpl_context as c
diff --git a/Allura/allura/tests/unit/test_sitemapentry.py b/Allura/allura/tests/unit/test_sitemapentry.py
index 73d4bbd8c..f4ec40822 100644
--- a/Allura/allura/tests/unit/test_sitemapentry.py
+++ b/Allura/allura/tests/unit/test_sitemapentry.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 from mock import Mock
 
 from allura.app import SitemapEntry
diff --git a/Allura/allura/tests/unit/test_solr.py b/Allura/allura/tests/unit/test_solr.py
index 54c2144e7..42c4643ce 100644
--- a/Allura/allura/tests/unit/test_solr.py
+++ b/Allura/allura/tests/unit/test_solr.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 
 import mock
 from markupsafe import Markup
diff --git a/Allura/allura/webhooks.py b/Allura/allura/webhooks.py
index 54f0354e7..68098f84d 100644
--- a/Allura/allura/webhooks.py
+++ b/Allura/allura/webhooks.py
@@ -42,7 +42,6 @@ from allura.lib import validators as v
 from allura.lib.decorators import require_post, task
 from allura.lib.utils import DateJSONEncoder
 from allura import model as M
-import six
 
 
 log = logging.getLogger(__name__)
diff --git a/Allura/allura/websetup/bootstrap.py b/Allura/allura/websetup/bootstrap.py
index 6ac4b430c..c0e47e6db 100644
--- a/Allura/allura/websetup/bootstrap.py
+++ b/Allura/allura/websetup/bootstrap.py
@@ -17,9 +17,7 @@
 
 """Setup the allura application"""
 import os
-import sys
 import logging
-import shutil
 from datetime import datetime
 from textwrap import dedent
 
@@ -28,7 +26,6 @@ from tg import tmpl_context as c, app_globals as g
 from paste.deploy.converters import asbool
 import ew
 
-from allura.lib.decorators import memoize
 from allura.model.oauth import dummy_oauths
 from ming import Session, mim
 from ming.odm import state, session
@@ -43,7 +40,6 @@ from allura.command import CreateTroveCategoriesCommand
 from allura.websetup.schema import REGISTRY
 
 from forgewiki import model as WM
-import six
 
 log = logging.getLogger(__name__)
 
diff --git a/Allura/allura/websetup/schema.py b/Allura/allura/websetup/schema.py
index 52bfd9763..424e2d0a7 100644
--- a/Allura/allura/websetup/schema.py
+++ b/Allura/allura/websetup/schema.py
@@ -35,7 +35,6 @@ REGISTRY = Registry()
 
 def setup_schema(command, conf, vars):
     """Place any commands to setup allura here"""
-    import ming
     import allura
 
     # turbogears has its own special magic wired up for its globals, can't use a regular Registry
diff --git a/AlluraTest/alluratest/controller.py b/AlluraTest/alluratest/controller.py
index 1c4cf32b6..b41d69dfe 100644
--- a/AlluraTest/alluratest/controller.py
+++ b/AlluraTest/alluratest/controller.py
@@ -25,14 +25,11 @@ import six.moves.urllib.error
 import json
 
 import mock
-import beaker.session
-from bs4 import BeautifulSoup
 from formencode import variabledecode
 from paste.deploy import loadapp
 from paste.deploy.converters import asbool
 from paste.script.appinstall import SetupCommand
-from tg import tmpl_context as c, app_globals as g
-from tg import url, request, response, session
+from tg import tmpl_context as c
 import tg
 from tg.wsgiapp import RequestLocals
 from webob import Response, Request
diff --git a/AlluraTest/alluratest/tools.py b/AlluraTest/alluratest/tools.py
index 3f2c0eab8..3dcd5c4a2 100644
--- a/AlluraTest/alluratest/tools.py
+++ b/AlluraTest/alluratest/tools.py
@@ -15,9 +15,7 @@
 #       specific language governing permissions and limitations
 #       under the License.
 import functools
-import re
 
-from decorator import decorator
 import unittest
 testcase = unittest.TestCase(methodName='__init__')  # py2 needs a methodName that is a valid attr :/
 
diff --git a/AlluraTest/alluratest/validation.py b/AlluraTest/alluratest/validation.py
index c8c246aff..434b1a140 100644
--- a/AlluraTest/alluratest/validation.py
+++ b/AlluraTest/alluratest/validation.py
@@ -18,19 +18,14 @@
 """
 Functions to syntax-validate output content
 """
-from os import path
 import os
 import sys
 import logging
 import tempfile
 import subprocess
 import json
-import six.moves.urllib.parse
-import six.moves.urllib.request
-import six.moves.urllib.error
 import re
 import pkg_resources
-import six
 
 import webtest
 from webtest import TestApp, TestResponse
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index de05a1944..2a911a3c8 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -26,7 +26,7 @@ from tg import tmpl_context as c, app_globals as g
 from tg import request, response
 from tg import expose, validate, config
 from tg.decorators import with_trailing_slash, without_trailing_slash
-from paste.deploy.converters import asbool, asint
+from paste.deploy.converters import asbool
 from webob import exc
 import feedgenerator as FG
 from activitystream.storage.mingstorage import Activity
diff --git a/ForgeBlog/forgeblog/model/blog.py b/ForgeBlog/forgeblog/model/blog.py
index c152b7862..5010d1482 100644
--- a/ForgeBlog/forgeblog/model/blog.py
+++ b/ForgeBlog/forgeblog/model/blog.py
@@ -35,7 +35,6 @@ from allura.model.timeline import ActivityObject
 from allura.model.types import MarkdownCache
 from allura.lib import helpers as h
 from allura.lib import utils
-import six
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
diff --git a/ForgeBlog/forgeblog/tests/test_commands.py b/ForgeBlog/forgeblog/tests/test_commands.py
index b6d2f7c01..4a1d797ec 100644
--- a/ForgeBlog/forgeblog/tests/test_commands.py
+++ b/ForgeBlog/forgeblog/tests/test_commands.py
@@ -15,12 +15,9 @@
 #       specific language governing permissions and limitations
 #       under the License.
 import html
-from datetime import datetime, timedelta
 from io import BytesIO
 from unittest import skipIf
 import pkg_resources
-import mock
-import feedparser
 from mock import patch
 
 from ming.odm.odmsession import ThreadLocalODMSession
diff --git a/ForgeDiscussion/forgediscussion/controllers/forum.py b/ForgeDiscussion/forgediscussion/controllers/forum.py
index 8a2a15918..b7f3e0761 100644
--- a/ForgeDiscussion/forgediscussion/controllers/forum.py
+++ b/ForgeDiscussion/forgediscussion/controllers/forum.py
@@ -22,7 +22,6 @@ import pymongo
 from allura.lib.search import mapped_artifacts_from_index_ids
 
 from tg import expose, validate, redirect
-from tg import request
 from tg import tmpl_context as c, app_globals as g
 from webob import exc
 from formencode import validators
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index da5b157ef..2c985d8f6 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -33,7 +33,7 @@ from formencode import validators
 from webob import exc
 import pymongo
 
-from allura.lib.security import require_access, has_access, require_authenticated
+from allura.lib.security import require_access, has_access
 from allura.lib.search import search_app
 from allura.lib import helpers as h
 from allura.lib import validators as v
diff --git a/ForgeDiscussion/forgediscussion/forum_main.py b/ForgeDiscussion/forgediscussion/forum_main.py
index a3bf469d1..f1d9448f8 100644
--- a/ForgeDiscussion/forgediscussion/forum_main.py
+++ b/ForgeDiscussion/forgediscussion/forum_main.py
@@ -20,7 +20,6 @@ import six.moves.urllib.request
 import six.moves.urllib.parse
 import six.moves.urllib.error
 import json
-import os
 
 # Non-stdlib imports
 from tg import tmpl_context as c, app_globals as g
diff --git a/ForgeDiscussion/forgediscussion/import_support.py b/ForgeDiscussion/forgediscussion/import_support.py
index cd0d6a89e..80b484793 100644
--- a/ForgeDiscussion/forgediscussion/import_support.py
+++ b/ForgeDiscussion/forgediscussion/import_support.py
@@ -26,7 +26,6 @@ from tg import tmpl_context as c
 from allura import model as M
 
 from forgediscussion import model as DM
-import six
 
 log = logging.getLogger(__name__)
 
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 3e0be4ae7..45dfcd00c 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -15,9 +15,7 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import re
 import logging
-from itertools import chain
 import typing
 
 import pymongo
diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py b/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
index 6665fa784..4bbe6965b 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_forum.py
@@ -25,7 +25,6 @@ from email.mime.multipart import MIMEMultipart
 
 import pkg_resources
 import pymongo
-import webtest
 
 from ming.odm import ThreadLocalODMSession
 from tg import tmpl_context as c
diff --git a/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py b/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
index 4c90af637..1909b6d89 100644
--- a/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
+++ b/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
@@ -25,10 +25,8 @@ from allura.lib import validators as V
 from allura.lib.widgets import discuss as DW
 from allura.lib.widgets import form_fields as ffw
 from allura.lib.widgets.forms import CsrfForm
-from allura.lib.widgets.subscriptions import SubscribeForm
 
 from forgediscussion import model as M
-import six
 
 
 class _ThreadsTable(DW._ThreadsTable):
diff --git a/ForgeFeedback/forgefeedback/feedback_main.py b/ForgeFeedback/forgefeedback/feedback_main.py
index 581fa61f7..07b937e27 100644
--- a/ForgeFeedback/forgefeedback/feedback_main.py
+++ b/ForgeFeedback/forgefeedback/feedback_main.py
@@ -20,7 +20,7 @@ import pymongo
 
 # Non-stdlib imports
 
-from tg import expose, flash, url, config, request, redirect
+from tg import expose, flash, redirect
 from tg.decorators import with_trailing_slash, without_trailing_slash
 from tg import tmpl_context as c, app_globals as g
 from ming.odm import session
@@ -39,8 +39,7 @@ from allura.app import (
 from allura.controllers import BaseController
 from allura.controllers.feed import FeedController
 from allura.lib.decorators import require_post
-from allura.lib.security import (require_access, has_access)
-from allura.model import project
+from allura.lib.security import (require_access)
 
 # Local imports
 
diff --git a/ForgeFeedback/forgefeedback/model/feedback.py b/ForgeFeedback/forgefeedback/model/feedback.py
index bb01cdee4..fcffd65a7 100644
--- a/ForgeFeedback/forgefeedback/model/feedback.py
+++ b/ForgeFeedback/forgefeedback/model/feedback.py
@@ -16,9 +16,6 @@
 #       under the License.
 
 import logging
-import six.moves.urllib.request
-import six.moves.urllib.parse
-import six.moves.urllib.error
 import typing
 from datetime import datetime
 
@@ -32,9 +29,7 @@ from ming.odm import FieldProperty, ForeignIdProperty, RelationProperty
 
 from allura.model.artifact import VersionedArtifact
 from allura.model.auth import AlluraUserProperty, User
-from allura.model.project import ProjectRole
 from allura.model.timeline import ActivityObject
-from allura.lib import helpers as h
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
diff --git a/ForgeFeedback/forgefeedback/tests/functional/test_root.py b/ForgeFeedback/forgefeedback/tests/functional/test_root.py
index 69243f0d5..b751eb7a3 100644
--- a/ForgeFeedback/forgefeedback/tests/functional/test_root.py
+++ b/ForgeFeedback/forgefeedback/tests/functional/test_root.py
@@ -15,14 +15,10 @@
 #       specific language governing permissions and limitations
 #       under the License.
 from tg import tmpl_context as c
-from tg import config
 
 from allura import model as M
 from alluratest.controller import TestController
-from allura.lib import helpers as h
-from allura.tests import decorators as td
 
-from forgefeedback import model as FM
 
 
 class TestFeedback(TestController):
diff --git a/ForgeFiles/forgefiles/files_main.py b/ForgeFiles/forgefiles/files_main.py
index 98517a6ed..7c91a6896 100755
--- a/ForgeFiles/forgefiles/files_main.py
+++ b/ForgeFiles/forgefiles/files_main.py
@@ -23,7 +23,7 @@ from urllib.parse import unquote
 from tg import config, redirect, expose, flash
 from tg.decorators import with_trailing_slash, without_trailing_slash
 from tg import tmpl_context as c, app_globals as g
-from tg import request, response
+from tg import request
 from jinja2.exceptions import TemplateNotFound
 
 from allura.app import Application
diff --git a/ForgeGit/forgegit/controllers.py b/ForgeGit/forgegit/controllers.py
index 2062d0c24..ee64b0b60 100644
--- a/ForgeGit/forgegit/controllers.py
+++ b/ForgeGit/forgegit/controllers.py
@@ -17,7 +17,7 @@
 
 
 from allura.lib.utils import permanent_redirect
-from tg import expose, redirect
+from tg import expose
 from tg.decorators import with_trailing_slash
 from tg import tmpl_context as c
 
diff --git a/ForgeGit/forgegit/tests/model/test_repository.py b/ForgeGit/forgegit/tests/model/test_repository.py
index 7d0e97130..adcbf756f 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -19,7 +19,6 @@
 import os
 import shutil
 import stat
-import unittest
 import pkg_resources
 import datetime
 import email.iterators
diff --git a/ForgeGit/forgegit/tests/test_git_app.py b/ForgeGit/forgegit/tests/test_git_app.py
index ee4df227f..d158b30f5 100644
--- a/ForgeGit/forgegit/tests/test_git_app.py
+++ b/ForgeGit/forgegit/tests/test_git_app.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 
 from tg import tmpl_context as c
 from ming.odm import ThreadLocalODMSession
diff --git a/ForgeGit/forgegit/tests/test_tasks.py b/ForgeGit/forgegit/tests/test_tasks.py
index 48ea4828e..48ab369bd 100644
--- a/ForgeGit/forgegit/tests/test_tasks.py
+++ b/ForgeGit/forgegit/tests/test_tasks.py
@@ -14,7 +14,6 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-import unittest
 import mock
 from testfixtures import LogCapture
 
diff --git a/ForgeImporters/forgeimporters/github/tracker.py b/ForgeImporters/forgeimporters/github/tracker.py
index 26f66551d..a9f27d205 100644
--- a/ForgeImporters/forgeimporters/github/tracker.py
+++ b/ForgeImporters/forgeimporters/github/tracker.py
@@ -19,7 +19,6 @@ import re
 import logging
 from datetime import datetime
 from urllib.error import HTTPError
-import six
 from io import BytesIO
 
 from tg import (
diff --git a/ForgeImporters/forgeimporters/github/wiki.py b/ForgeImporters/forgeimporters/github/wiki.py
index a0fc47770..a36e0e858 100644
--- a/ForgeImporters/forgeimporters/github/wiki.py
+++ b/ForgeImporters/forgeimporters/github/wiki.py
@@ -21,7 +21,6 @@ from datetime import datetime
 from tempfile import mkdtemp
 from shutil import rmtree
 
-import six
 
 from bs4 import BeautifulSoup
 import git
diff --git a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
index daff4e392..9cdadba1c 100644
--- a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
@@ -26,7 +26,7 @@ from ming.odm import ThreadLocalODMSession
 from tg import tmpl_context as c, config
 
 from allura.tests import TestController
-from allura.tests.decorators import with_tracker, with_wiki
+from allura.tests.decorators import with_tracker
 from alluratest.controller import TestRestApiBase, setup_unit_test
 from alluratest.tools import module_not_available
 
diff --git a/ForgeSVN/forgesvn/controllers.py b/ForgeSVN/forgesvn/controllers.py
index ac07d05a5..030e2f0e2 100644
--- a/ForgeSVN/forgesvn/controllers.py
+++ b/ForgeSVN/forgesvn/controllers.py
@@ -17,7 +17,7 @@
 
 
 from allura.lib.utils import permanent_redirect
-from tg import expose, redirect
+from tg import expose
 from tg.decorators import with_trailing_slash
 from tg import tmpl_context as c
 
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index 6d210f128..278f4bf4b 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -36,7 +36,7 @@ import tg
 import pysvn
 from paste.deploy.converters import asbool, asint
 from pymongo.errors import DuplicateKeyError
-from tg import tmpl_context as c, app_globals as g
+from tg import app_globals as g
 
 from ming.base import Object
 from ming.odm import Mapper, FieldProperty
@@ -44,7 +44,6 @@ from ming.utils import LazyProperty
 
 from allura import model as M
 from allura.lib import helpers as h
-from allura.model.auth import User
 from allura.model.repository import zipdir
 from allura.model import repository as RM
 
diff --git a/ForgeSVN/forgesvn/svn_main.py b/ForgeSVN/forgesvn/svn_main.py
index f2bf240b0..cf712eedd 100644
--- a/ForgeSVN/forgesvn/svn_main.py
+++ b/ForgeSVN/forgesvn/svn_main.py
@@ -26,7 +26,6 @@ from ming.odm.odmsession import ThreadLocalODMSession
 from tg import expose, redirect, validate, flash
 from tg.decorators import with_trailing_slash, without_trailing_slash
 from timermiddleware import Timer
-from paste.deploy.converters import asint
 
 # Pyforge-specific imports
 import allura.tasks.repo_tasks
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index 6d3338f3c..f1e95c18e 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -17,7 +17,6 @@
 
 import os
 import shutil
-import unittest
 from unittest import skipUnless
 
 import pkg_resources
diff --git a/ForgeSVN/forgesvn/tests/test_svn_app.py b/ForgeSVN/forgesvn/tests/test_svn_app.py
index 1811445d7..ad910ceab 100644
--- a/ForgeSVN/forgesvn/tests/test_svn_app.py
+++ b/ForgeSVN/forgesvn/tests/test_svn_app.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 
 from tg import tmpl_context as c
 from ming.odm import ThreadLocalODMSession
diff --git a/ForgeSVN/forgesvn/tests/test_tasks.py b/ForgeSVN/forgesvn/tests/test_tasks.py
index a948a4f82..8df3e80d1 100644
--- a/ForgeSVN/forgesvn/tests/test_tasks.py
+++ b/ForgeSVN/forgesvn/tests/test_tasks.py
@@ -16,7 +16,6 @@
 #       under the License.
 
 import shutil
-import unittest
 import os
 
 import tg
diff --git a/ForgeShortUrl/forgeshorturl/model/shorturl.py b/ForgeShortUrl/forgeshorturl/model/shorturl.py
index 605eb690b..8da0aef9b 100644
--- a/ForgeShortUrl/forgeshorturl/model/shorturl.py
+++ b/ForgeShortUrl/forgeshorturl/model/shorturl.py
@@ -19,7 +19,7 @@ import typing
 import pymongo
 from tg import config
 from tg import tmpl_context as c
-from ming.odm import FieldProperty, ForeignIdProperty, session
+from ming.odm import FieldProperty, session
 from datetime import datetime
 from allura.model.auth import User
 from allura import model as M
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index 13acf1c0b..abfe426bd 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -31,7 +31,6 @@ from allura.lib.plugin import ImportIdConverter
 
 # Local imports
 from forgetracker import model as TM
-import six
 
 try:
     from forgeimporters.base import ProjectExtractor
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 9ca5a77bf..05a0fbd74 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -32,7 +32,6 @@ import pymongo
 from pymongo.errors import OperationFailure
 from tg import tmpl_context as c, app_globals as g
 from paste.deploy.converters import aslist, asbool
-import jinja2
 import markupsafe
 
 from ming import schema
diff --git a/ForgeTracker/forgetracker/plugins.py b/ForgeTracker/forgetracker/plugins.py
index 676deb255..71f6832de 100644
--- a/ForgeTracker/forgetracker/plugins.py
+++ b/ForgeTracker/forgetracker/plugins.py
@@ -17,7 +17,5 @@
 
 import logging
 
-from tg import config
-from tg import app_globals as g
 
 log = logging.getLogger(__name__)
diff --git a/ForgeTracker/forgetracker/search.py b/ForgeTracker/forgetracker/search.py
index 10cd3c083..d215cc631 100644
--- a/ForgeTracker/forgetracker/search.py
+++ b/ForgeTracker/forgetracker/search.py
@@ -17,7 +17,6 @@
 from tg import tmpl_context as c
 
 from allura.lib.search import search
-import six
 
 
 FACET_PARAMS = {
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index 2e1ffb229..a392db564 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -15,9 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 from datetime import datetime
-import six.moves.urllib.request
-import six.moves.urllib.parse
-import six.moves.urllib.error
 import os
 import time
 import json
@@ -48,7 +45,6 @@ from allura.lib.utils import urlencode
 from allura.tests import decorators as td
 from allura.tasks import mail_tasks
 from ming.odm.odmsession import ThreadLocalODMSession
-import six
 
 
 def find(d, pred):
diff --git a/ForgeTracker/forgetracker/tests/unit/test_root_controller.py b/ForgeTracker/forgetracker/tests/unit/test_root_controller.py
index 9f1a6950a..aa8312c39 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_root_controller.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_root_controller.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import unittest
 
 from mock import Mock, patch
 from ming.odm.odmsession import session
diff --git a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
index d62b6bf19..f580797fb 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
@@ -17,7 +17,6 @@
 
 from tg import tmpl_context as c
 from datetime import datetime
-from io import BytesIO
 import os
 import six.moves.urllib.parse
 import six.moves.urllib.request
diff --git a/ForgeTracker/forgetracker/widgets/ticket_form.py b/ForgeTracker/forgetracker/widgets/ticket_form.py
index aa45ee83d..fc19fb94e 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_form.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_form.py
@@ -26,7 +26,6 @@ from allura import model as M
 from allura.lib.widgets import form_fields as ffw
 from allura.lib import helpers as h
 from allura.lib import validators as v
-import six
 
 
 class TicketCustomFields(ew.CompoundField):
diff --git a/ForgeTracker/forgetracker/widgets/ticket_search.py b/ForgeTracker/forgetracker/widgets/ticket_search.py
index 8139becf6..effa98f3b 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_search.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_search.py
@@ -20,7 +20,6 @@ import ew.jinja2_ew as ew
 
 from allura.lib.widgets import form_fields as ffw
 from allura.lib.widgets import forms
-import six
 
 
 
diff --git a/ForgeUserStats/forgeuserstats/controllers/userstats.py b/ForgeUserStats/forgeuserstats/controllers/userstats.py
index 7df06f51f..02e10c663 100644
--- a/ForgeUserStats/forgeuserstats/controllers/userstats.py
+++ b/ForgeUserStats/forgeuserstats/controllers/userstats.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 from datetime import datetime
-import re
 
 from tg import expose, validate, redirect
 from tg.decorators import with_trailing_slash
diff --git a/ForgeUserStats/forgeuserstats/tests/test_model.py b/ForgeUserStats/forgeuserstats/tests/test_model.py
index 74703fa86..9842cc642 100644
--- a/ForgeUserStats/forgeuserstats/tests/test_model.py
+++ b/ForgeUserStats/forgeuserstats/tests/test_model.py
@@ -16,7 +16,6 @@
 #       under the License.
 
 import pkg_resources
-import unittest
 from datetime import datetime, timedelta
 
 from tg import tmpl_context as c
diff --git a/ForgeUserStats/forgeuserstats/tests/test_stats.py b/ForgeUserStats/forgeuserstats/tests/test_stats.py
index 9e4bb43ed..b44e900d7 100644
--- a/ForgeUserStats/forgeuserstats/tests/test_stats.py
+++ b/ForgeUserStats/forgeuserstats/tests/test_stats.py
@@ -16,7 +16,6 @@
 #       under the License.
 
 import pkg_resources
-import unittest
 
 from tg import tmpl_context as c
 
diff --git a/ForgeWiki/forgewiki/converters.py b/ForgeWiki/forgewiki/converters.py
index 0a3575649..5a194e4f8 100644
--- a/ForgeWiki/forgewiki/converters.py
+++ b/ForgeWiki/forgewiki/converters.py
@@ -17,7 +17,6 @@
 
 import re
 from bs4 import BeautifulSoup
-import six
 
 _inline_img = re.compile(r'\[\[(File|Image):([^\]|]+)[^]]*\]\]', re.UNICODE)
 _inline_img_markdown = r'[[img src=\2]]'
diff --git a/ForgeWiki/forgewiki/model/wiki.py b/ForgeWiki/forgewiki/model/wiki.py
index 4b10c2a76..5b6d0e682 100644
--- a/ForgeWiki/forgewiki/model/wiki.py
+++ b/ForgeWiki/forgewiki/model/wiki.py
@@ -35,7 +35,6 @@ from allura.model import (
     Snapshot,
     Feed,
     Thread,
-    Post,
     User,
     BaseAttachment,
     Notification,
diff --git a/run_tests b/run_tests
index e83aec083..3310ca91e 100755
--- a/run_tests
+++ b/run_tests
@@ -18,7 +18,6 @@
 #       under the License.
 
 import argparse
-from collections import defaultdict
 from glob import glob
 import json
 import multiprocessing
diff --git a/scripts/migrations/032-subscribe-merge-request-submitters.py b/scripts/migrations/032-subscribe-merge-request-submitters.py
index f04c20574..cc630f921 100644
--- a/scripts/migrations/032-subscribe-merge-request-submitters.py
+++ b/scripts/migrations/032-subscribe-merge-request-submitters.py
@@ -17,7 +17,7 @@
 
 import logging
 
-from ming.odm import ThreadLocalODMSession, state
+from ming.odm import ThreadLocalODMSession
 
 from allura.lib import utils
 from allura import model as M
diff --git a/scripts/migrations/033-change-comment-anon-permissions.py b/scripts/migrations/033-change-comment-anon-permissions.py
index 2cfb824d9..26f5790dc 100644
--- a/scripts/migrations/033-change-comment-anon-permissions.py
+++ b/scripts/migrations/033-change-comment-anon-permissions.py
@@ -15,14 +15,13 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import sys
 import logging
-from ming.odm import ThreadLocalODMSession, session
+from ming.odm import session
 from tg import tmpl_context as c
 from allura import model as M
 from forgediscussion.model import ForumPost
 from allura.lib import utils, security
-from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, ArgumentTypeError
+from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
 
 
 log = logging.getLogger(__name__)
diff --git a/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py b/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py
index 3eb4c488a..7e3dc1c3e 100644
--- a/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py
+++ b/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py
@@ -22,7 +22,6 @@ from tg import tmpl_context as c
 from bson import ObjectId
 
 from ming.odm import session
-from ming.odm import ThreadLocalODMSession
 
 from allura import model as M
 from forgetracker import model as TM
diff --git a/scripts/perf/generate-projects.py b/scripts/perf/generate-projects.py
index 503ed255c..1122fa762 100644
--- a/scripts/perf/generate-projects.py
+++ b/scripts/perf/generate-projects.py
@@ -15,7 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import re
 from ming.odm import ThreadLocalODMSession
 from allura import model as M
 
diff --git a/scripts/perf/load-up-forum.py b/scripts/perf/load-up-forum.py
index 3e6773f15..91338dec1 100644
--- a/scripts/perf/load-up-forum.py
+++ b/scripts/perf/load-up-forum.py
@@ -17,12 +17,11 @@
 
 
 import logging
-import uuid
-from ming.odm import ThreadLocalODMSession, session
+from ming.odm import session
 from tg import tmpl_context as c
 from allura import model as M
-from forgediscussion.model import ForumPost, Forum
-from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, ArgumentTypeError
+from forgediscussion.model import Forum
+from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
 from allura.lib import helpers as h
 from random import randint
 
diff --git a/scripts/trac_import.py b/scripts/trac_import.py
index dc61bf04b..a066d0004 100644
--- a/scripts/trac_import.py
+++ b/scripts/trac_import.py
@@ -20,7 +20,6 @@ from optparse import OptionParser
 
 from allura.lib.import_api import AlluraImportApiClient
 from tracwikiimporter.scripts.wiki_from_trac.loaders import import_wiki
-import six
 
 
 def main():


(allura) 03/03: pep8 reformatting

Posted by br...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git

commit bce9a59c250d3c16ea22e939674a9463ed1acaf2
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Wed Oct 30 13:06:03 2024 -0400

    pep8 reformatting
---
 Allura/allura/controllers/auth.py                  |   1 +
 Allura/allura/controllers/rest.py                  |   1 +
 Allura/allura/lib/custom_middleware.py             |   4 +-
 Allura/allura/lib/helpers.py                       |   2 +
 Allura/allura/lib/patches.py                       |   2 +
 Allura/allura/lib/plugin.py                        |   1 -
 Allura/allura/lib/security.py                      |   2 +-
 Allura/allura/lib/solr.py                          |   4 +-
 Allura/allura/lib/widgets/oauth_widgets.py         |   1 -
 Allura/allura/lib/widgets/project_list.py          |   6 +-
 Allura/allura/model/auth.py                        |   2 +-
 Allura/allura/model/discuss.py                     |   2 +-
 Allura/allura/model/index.py                       |   2 +-
 Allura/allura/model/notification.py                |   4 +-
 Allura/allura/model/repo_refresh.py                |   2 +-
 Allura/allura/model/session.py                     |   2 +-
 Allura/allura/model/timeline.py                    |   1 +
 Allura/allura/scripts/refreshrepo.py               |   2 +-
 Allura/allura/tasks/admin_tasks.py                 |   1 +
 Allura/allura/templates/__init__.py                |   1 -
 Allura/allura/templates_responsive/__init__.py     |   2 +-
 Allura/allura/tests/exclude_from_rewrite_hook.py   |   2 +-
 Allura/allura/tests/functional/__init__.py         |   1 -
 Allura/allura/tests/functional/test_admin.py       |   2 +-
 Allura/allura/tests/functional/test_auth.py        |  54 +++++---
 Allura/allura/tests/functional/test_feeds.py       |   2 +-
 .../tests/functional/test_personal_dashboard.py    |   2 +-
 Allura/allura/tests/functional/test_rest.py        |   2 +-
 Allura/allura/tests/functional/test_root.py        |   2 +-
 Allura/allura/tests/model/__init__.py              |   1 -
 Allura/allura/tests/model/test_artifact.py         |   2 +
 Allura/allura/tests/model/test_auth.py             |  14 +-
 Allura/allura/tests/model/test_discussion.py       |   2 +-
 Allura/allura/tests/model/test_filesystem.py       |   2 +
 Allura/allura/tests/model/test_repo.py             |  13 +-
 Allura/allura/tests/scripts/__init__.py            |   1 -
 .../tests/scripts/test_create_sitemap_files.py     |   2 +-
 Allura/allura/tests/templates/__init__.py          |   1 -
 .../tests/templates/jinja_master/__init__.py       |   1 -
 Allura/allura/tests/test_globals.py                |   2 +-
 Allura/allura/tests/test_helpers.py                |   5 +-
 Allura/allura/tests/test_markdown.py               |   2 +-
 Allura/allura/tests/test_plugin.py                 |   6 +-
 Allura/allura/tests/test_validators.py             |   6 +-
 .../test_discussion_moderation_controller.py       |   2 +-
 Allura/allura/tests/unit/test_app.py               |   2 +-
 Allura/allura/tests/unit/test_artifact.py          |   2 +-
 Allura/allura/tests/unit/test_session.py           |   4 +-
 Allura/allura/tests/unit/test_solr.py              |   2 +-
 Allura/allura/websetup/bootstrap.py                |   5 +-
 Allura/ldap-setup.py                               |   1 +
 Allura/ldap-userconfig.py                          |   1 +
 Allura/setup.py                                    |   2 +-
 AlluraTest/alluratest/smtp_debug.py                |   2 +-
 AlluraTest/alluratest/test_syntax.py               |   1 -
 .../forgeactivity/tests/functional/test_root.py    |   2 +-
 ForgeBlog/forgeblog/tests/test_commands.py         |   2 +-
 ForgeBlog/forgeblog/widgets.py                     |   2 +-
 ForgeChat/forgechat/model/chat.py                  |   1 +
 .../forgediscussion/widgets/forum_widgets.py       |   2 +-
 ForgeFeedback/forgefeedback/feedback_main.py       |   9 +-
 .../forgefeedback/tests/functional/test_root.py    |   1 -
 ForgeFeedback/setup.py                             |   4 -
 ForgeFiles/forgefiles/files_main.py                |  17 ---
 ForgeFiles/forgefiles/model/files.py               |   3 -
 ForgeFiles/forgefiles/tests/__init__.py            |   1 -
 ForgeFiles/forgefiles/tests/functional/__init__.py |   1 -
 .../forgefiles/tests/functional/test_root.py       |   2 +-
 ForgeFiles/forgefiles/tests/model/__init__.py      |   1 -
 ForgeGit/forgegit/tests/test_tasks.py              |   1 -
 ForgeImporters/forgeimporters/forge/discussion.py  |  40 +++---
 .../forgeimporters/github/tests/test_utils.py      |   2 +-
 .../forgeimporters/github/tests/test_wiki.py       |   2 +-
 .../forgeimporters/tests/forge/test_discussion.py  | 154 ++++++++++-----------
 .../forgeimporters/tests/forge/test_tracker.py     |   4 +-
 .../tests/github/functional/test_github.py         |   1 -
 .../forgeimporters/tests/github/test_tracker.py    |   2 +-
 ForgeImporters/forgeimporters/tests/test_base.py   |   4 +-
 .../forgeimporters/trac/tests/test_tickets.py      |  11 +-
 ForgeSVN/forgesvn/tests/functional/test_auth.py    |   2 +-
 ForgeSVN/forgesvn/tests/model/test_repository.py   |   2 +-
 ForgeTracker/forgetracker/import_support.py        |   2 +-
 ForgeTracker/forgetracker/search.py                |   2 +-
 .../forgetracker/tests/unit/test_ticket_model.py   |   2 +-
 ForgeTracker/forgetracker/widgets/ticket_search.py |   1 -
 ForgeUserStats/forgeuserstats/tests/test_model.py  |   4 +-
 ForgeWiki/forgewiki/model/wiki.py                  |   1 +
 ForgeWiki/forgewiki/tests/test_models.py           |   1 +
 conftest.py                                        |   3 +-
 scripts/changelog.py                               |   1 +
 scripts/migrations/013-update-ordinals.py          |   1 +
 .../015-add-neighborhood_id-to-blog-posts.py       |   1 +
 .../migrations/020-remove-wiki-title-slashes.py    |   1 +
 scripts/migrations/022-change-anon-display-name.py |   1 +
 .../migrations/024-migrate-custom-profile-text.py  |   1 +
 scripts/migrations/025-add-is-nbhd-project.py      |   1 +
 scripts/migrations/026-install-activity-tool.py    |   1 +
 .../027-change-ticket-write-permissions.py         |   1 +
 scripts/migrations/028-remove-svn-trees.py         |   1 +
 scripts/migrations/029-set-mailbox-queue_empty.py  |   1 +
 .../migrations/031-set-user-pending-to-false.py    |   1 +
 ...34-update_subscriptions_ticket_and_mr_titles.py |   2 +-
 scripts/perf/load-up-forum.py                      |   2 +-
 scripts/perf/sstress.py                            |   1 +
 scripts/perf/test_git_lcd.py                       |   1 +
 105 files changed, 256 insertions(+), 247 deletions(-)

diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index 770281005..0b6a7e1d2 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -1545,6 +1545,7 @@ class OAuthController(BaseController):
         flash('Authorization revoked')
         redirect('.')
 
+
 class OAuth2AuthorizationController(BaseController):
     def _check_security(self):
         require_authenticated()
diff --git a/Allura/allura/controllers/rest.py b/Allura/allura/controllers/rest.py
index 82a39e1f4..0c45bb16e 100644
--- a/Allura/allura/controllers/rest.py
+++ b/Allura/allura/controllers/rest.py
@@ -546,6 +546,7 @@ class Oauth2Negotiator:
         response.status_int = status
         return body
 
+
 def rest_has_access(obj, user, perm):
     """
     Helper function that encapsulates common functionality for has_access API
diff --git a/Allura/allura/lib/custom_middleware.py b/Allura/allura/lib/custom_middleware.py
index 0e8c0392a..9e937a66d 100644
--- a/Allura/allura/lib/custom_middleware.py
+++ b/Allura/allura/lib/custom_middleware.py
@@ -326,7 +326,7 @@ class AlluraTimerMiddleware(TimerMiddleware):
                   debug_each_call=False),
             Timer('ming', ming.odm.odmsession.ODMSession,
                   'insert_now', 'update_now', 'delete_now',
-                  'find', 'find_one_and_update', 'find_one_and_replace', 'find_one_and_delete', 
+                  'find', 'find_one_and_update', 'find_one_and_replace', 'find_one_and_delete',
                   'remove', 'update', 'update_if_not_modified',
                   'aggregate', 'distinct',
                   ),
@@ -502,7 +502,7 @@ class ContentSecurityPolicyMiddleware:
                 srcs += ' ' + ' '.join(environ['csp_form_actions'])
 
             oauth_endpoints = (
-            '/auth/oauth2/authorize', '/auth/oauth2/do_authorize', '/rest/oauth/authorize', '/rest/oauth/do_authorize')
+                '/auth/oauth2/authorize', '/auth/oauth2/do_authorize', '/rest/oauth/authorize', '/rest/oauth/do_authorize')
             if not req.path.startswith(oauth_endpoints):  # Do not enforce CSP for OAuth1 and OAuth2 authorization
                 if asbool(self.config.get('csp.form_actions_enforce', False)):
                     rules.add(f"form-action {srcs}")
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index 8631f09ca..a8a903da7 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -1051,6 +1051,7 @@ class NoInternalHTTPSHandler(urllib.request.HTTPSHandler):
             validators.NonPrivateUrl().to_python(req.full_url, None)
         return super().https_open(req)
 
+
 class UseKnownIPHTTPConnection(http.client.HTTPConnection):
     # only for http, since https requires a valid cert it should be ok
     def __init__(self, *a, known_ip_to_use=None, **kw):
@@ -1073,6 +1074,7 @@ class NotInternalHTTPHandler(urllib.request.HTTPHandler):
         else:
             return super().http_open(req)
 
+
 urllib.request.install_opener(urllib.request.build_opener(NotInternalHTTPHandler, NoInternalHTTPSHandler))
 
 
diff --git a/Allura/allura/lib/patches.py b/Allura/allura/lib/patches.py
index d8d642394..ec810fab1 100644
--- a/Allura/allura/lib/patches.py
+++ b/Allura/allura/lib/patches.py
@@ -24,6 +24,8 @@ from tg import request
 from allura.lib import helpers as h
 
 _patched = False
+
+
 def apply():
     global _patched  # noqa: PLW0603
     if _patched:
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index fa059bd38..6275c20bc 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -820,7 +820,6 @@ class LdapAuthenticationProvider(AuthenticationProvider):
                 raise ValueError(f'LDAP algorithms should always start with ldap_ (got {algorithm})')
         return crypt
 
-
     def set_password(self, user, old_password, new_password, set_timestamp=True):
         dn = ldap_user_dn(user.username)
         if old_password is not None:
diff --git a/Allura/allura/lib/security.py b/Allura/allura/lib/security.py
index 1db9f19c2..10805f093 100644
--- a/Allura/allura/lib/security.py
+++ b/Allura/allura/lib/security.py
@@ -304,7 +304,7 @@ def debug_obj(obj) -> str:
     return str(obj)
 
 
-def has_access(obj, permission: str, user: M.User | None = None, project: M.Project | None = None, roles = None) -> bool:
+def has_access(obj, permission: str, user: M.User | None = None, project: M.Project | None = None, roles=None) -> bool:
     '''Return whether the given user has the permission name on the given object.
 
     - First, all the roles for a user in the given project context are computed.
diff --git a/Allura/allura/lib/solr.py b/Allura/allura/lib/solr.py
index 49511d8aa..68fddb3c6 100644
--- a/Allura/allura/lib/solr.py
+++ b/Allura/allura/lib/solr.py
@@ -62,7 +62,7 @@ def escape_solr_arg(term):
     return term
 
 
-def make_solr_from_config(push_servers: Iterable[str], query_server: str|None=None,
+def make_solr_from_config(push_servers: Iterable[str], query_server: str | None = None,
                           push_servers_auths: Iterable[tuple[str, str] | None] = (),
                           query_server_auth: tuple[str, str] | None = None,
                           **kwargs):
@@ -91,7 +91,7 @@ class Solr:
     unless explicitly overridden.
     """
 
-    def __init__(self, push_servers: Iterable[str], query_server: str|None = None,
+    def __init__(self, push_servers: Iterable[str], query_server: str | None = None,
                  push_servers_auths: Iterable[tuple[str, str] | None] = (),
                  query_server_auth: tuple[str, str] | None = None,
                  commit=True, commitWithin=None, **kw):
diff --git a/Allura/allura/lib/widgets/oauth_widgets.py b/Allura/allura/lib/widgets/oauth_widgets.py
index 7fe33b75e..5823907d4 100644
--- a/Allura/allura/lib/widgets/oauth_widgets.py
+++ b/Allura/allura/lib/widgets/oauth_widgets.py
@@ -81,4 +81,3 @@ class OAuth2ApplicationForm(ForgeForm):
             attrs=dict(type='url', style='min-width:25em; margin-left: 162px;',  # match grid-4 label width
                        pattern='https://.*', title='must start with https://'),
         )
-
diff --git a/Allura/allura/lib/widgets/project_list.py b/Allura/allura/lib/widgets/project_list.py
index b91d2dd84..d0d643e0c 100644
--- a/Allura/allura/lib/widgets/project_list.py
+++ b/Allura/allura/lib/widgets/project_list.py
@@ -37,7 +37,7 @@ class ProjectSummary(ew_core.Widget):
         show_proj_icon=True,
         show_download_button=True,
         show_awards_banner=True,
-        )
+    )
 
     def prepare_context(self, context):
         response = super().prepare_context(context)
@@ -84,7 +84,7 @@ class ProjectList(ew_core.Widget):
         show_proj_icon=True,
         show_download_button=True,
         show_awards_banner=True,
-        )
+    )
 
     def prepare_context(self, context):
         response = super().prepare_context(context)
@@ -121,4 +121,4 @@ class ProjectScreenshots(ew_core.Widget):
     def resources(self):
         yield ew.JSLink('allura/js/Sortable.min.js')
         yield ew.JSLink('js/screenshots.js')
-        yield ew.CSSLink('css/screenshots.css')
\ No newline at end of file
+        yield ew.CSSLink('css/screenshots.css')
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 51dc98617..a14cbf2ad 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -175,7 +175,7 @@ please visit the following URL:
 '''.format(self.email,
             self.claimed_by_user(include_pending=True).username,
             h.absurl(f'/auth/verify_addr?a={h.urlquote(self.nonce)}'),
-       )
+           )
         log.info('Verification email:\n%s', text)
         allura.tasks.mail_tasks.sendsimplemail.post(
             fromaddr=g.noreply,
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 6cb0b6ef3..35d07cc77 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -405,7 +405,7 @@ class Thread(Artifact, ActivityObject):
             if (has_access(self, 'moderate', u)
                 and Mailbox.subscribed(user_id=u._id,
                                        app_config_id=post.app_config_id)):
-                    n.send_direct(str(u._id))
+                n.send_direct(str(u._id))
 
     def update_stats(self):
         self.num_replies = self.post_class().query.find(
diff --git a/Allura/allura/model/index.py b/Allura/allura/model/index.py
index 50b33999f..64f5526b4 100644
--- a/Allura/allura/model/index.py
+++ b/Allura/allura/model/index.py
@@ -170,7 +170,7 @@ class Shortlink(MappedClass):
             result = {}
             # Parse all the links
             parsed_links = {link: cls._parse_link(link)
-                                for link in links}
+                            for link in links}
             links_by_artifact = defaultdict(list)
             project_ids = set()
             for link, d in list(parsed_links.items()):
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index a8b5a7625..337411c3d 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -237,7 +237,7 @@ class Notification(MappedClass):
             but the notification still gets sent if there is an error
             '''
             log.warning('Could not render notification template %s' %
-                     artifact.type_s, exc_info=True)
+                        artifact.type_s, exc_info=True)
 
         assert d['reply_to_address'] is not None
         project = c.project
@@ -622,7 +622,7 @@ class Mailbox(MappedClass):
                         queue=[],
                         queue_empty=True,
                         )},
-                )
+            )
             mbox.fire(now)
 
     def fire(self, now):
diff --git a/Allura/allura/model/repo_refresh.py b/Allura/allura/model/repo_refresh.py
index e5dbbbea2..2e1fa2a3a 100644
--- a/Allura/allura/model/repo_refresh.py
+++ b/Allura/allura/model/repo_refresh.py
@@ -92,7 +92,7 @@ def refresh_repo(repo, all_commits=False, notify=True, new_clone=False, commits_
             if user is not None:
                 g.statsUpdater.newCommit(new, repo.app_config.project, user)
             actor = user or TransientActor(
-                    activity_name=new.committed.name or new.committed.email)
+                activity_name=new.committed.name or new.committed.email)
             g.director.create_activity(actor, 'committed', new, target=repo.app,
                                        related_nodes=[repo.app_config.project],
                                        tags=['commit', repo.tool.lower()])
diff --git a/Allura/allura/model/session.py b/Allura/allura/model/session.py
index 2752afa46..fb577f6be 100644
--- a/Allura/allura/model/session.py
+++ b/Allura/allura/model/session.py
@@ -273,7 +273,7 @@ task_doc_session = Session.by_name('task')
 main_orm_session = ThreadLocalODMSession(
     doc_session=main_doc_session,
     extensions=[IndexerSessionExtension]
-    )
+)
 main_explicitflush_orm_session = ThreadLocalODMSession(
     doc_session=main_doc_session,
     extensions=[IndexerSessionExtension, ExplicitFlushOnlySessionExtension]
diff --git a/Allura/allura/model/timeline.py b/Allura/allura/model/timeline.py
index 6c343bd6f..db3bbc342 100644
--- a/Allura/allura/model/timeline.py
+++ b/Allura/allura/model/timeline.py
@@ -114,6 +114,7 @@ class TransientActor(NodeBase, ActivityObjectBase):
     """An activity actor which is not a persistent Node in the network.
 
     """
+
     def __init__(self, activity_name):
         NodeBase.__init__(self)
         ActivityObjectBase.__init__(self)
diff --git a/Allura/allura/scripts/refreshrepo.py b/Allura/allura/scripts/refreshrepo.py
index 7756d1483..af5bee954 100644
--- a/Allura/allura/scripts/refreshrepo.py
+++ b/Allura/allura/scripts/refreshrepo.py
@@ -160,7 +160,7 @@ class RefreshRepo(ScriptTask):
         parser.add_argument('--clean-after', metavar='DATETIME', dest='clean_after',
                             type=lambda d: datetime.strptime(d, date_format),
                             help='Like --clean but only docs for commits after date ({} format)'.format(
-                                    date_format.replace('%', '%%')
+                                date_format.replace('%', '%%')
                             ))
         parser.add_argument(
             '--all', action='store_true', dest='all', default=False,
diff --git a/Allura/allura/tasks/admin_tasks.py b/Allura/allura/tasks/admin_tasks.py
index 9e30247a5..879e83f65 100644
--- a/Allura/allura/tasks/admin_tasks.py
+++ b/Allura/allura/tasks/admin_tasks.py
@@ -32,6 +32,7 @@ def install_app(*args, **kwargs):
     """
     c.project.install_app(*args, **kwargs)
 
+
 install_app.__doc__ += '''
     Arguments::
 
diff --git a/Allura/allura/templates/__init__.py b/Allura/allura/templates/__init__.py
index 7b9f3fc3e..5acea7ec6 100644
--- a/Allura/allura/templates/__init__.py
+++ b/Allura/allura/templates/__init__.py
@@ -16,4 +16,3 @@
 #       under the License.
 
 """Templates package for the application."""
-
diff --git a/Allura/allura/templates_responsive/__init__.py b/Allura/allura/templates_responsive/__init__.py
index d70ae0770..144e29886 100644
--- a/Allura/allura/templates_responsive/__init__.py
+++ b/Allura/allura/templates_responsive/__init__.py
@@ -13,4 +13,4 @@
 #       "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.
\ No newline at end of file
+#       under the License.
diff --git a/Allura/allura/tests/exclude_from_rewrite_hook.py b/Allura/allura/tests/exclude_from_rewrite_hook.py
index 828f994c4..6311e4001 100644
--- a/Allura/allura/tests/exclude_from_rewrite_hook.py
+++ b/Allura/allura/tests/exclude_from_rewrite_hook.py
@@ -46,4 +46,4 @@ def raise_compound_exception():
             assert False, 'assert %d' % x
         except Exception:
             errs.append(sys.exc_info())
-    raise CompoundError(*errs)
\ No newline at end of file
+    raise CompoundError(*errs)
diff --git a/Allura/allura/tests/functional/__init__.py b/Allura/allura/tests/functional/__init__.py
index f4a7b12aa..b8c15d776 100644
--- a/Allura/allura/tests/functional/__init__.py
+++ b/Allura/allura/tests/functional/__init__.py
@@ -16,4 +16,3 @@
 #       under the License.
 
 """Functional test suite for the controllers of the application."""
-
diff --git a/Allura/allura/tests/functional/test_admin.py b/Allura/allura/tests/functional/test_admin.py
index d0d6ee260..fa3249276 100644
--- a/Allura/allura/tests/functional/test_admin.py
+++ b/Allura/allura/tests/functional/test_admin.py
@@ -405,7 +405,7 @@ class TestProjectAdmin(TestController):
         upload = ('screenshot', file_name, file_data)
 
         self.app.get('/admin/')
-        e_filename, e_fileext =  os.path.splitext(file_name)
+        e_filename, e_fileext = os.path.splitext(file_name)
         with audits('screenshots: added screenshot {}'.format(f"{e_filename}-123{e_fileext}")):
             self.app.post('/admin/add_screenshot', params=dict(
                 caption='test me'),
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index a30f938b2..4d0180811 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -2184,7 +2184,11 @@ class TestOAuth2(TestController):
             redirect_uris=['https://localhost/']
         )
         ThreadLocalODMSession.flush_all()
-        r = self.app.get('/auth/oauth2/authorize', params={'client_id': 'client_12345', 'response_type': 'code', 'redirect_uri': 'https://localhost/'})
+        r = self.app.get('/auth/oauth2/authorize', params={
+            'client_id': 'client_12345',
+            'response_type': 'code',
+            'redirect_uri': 'https://localhost/',
+        })
         assert 'testoauth2' in r.text
         assert 'client_12345' in r.text
 
@@ -2201,11 +2205,14 @@ class TestOAuth2(TestController):
             redirect_uris=['https://localhost/']
         )
         ThreadLocalODMSession.flush_all()
-        r = self.app.get('/auth/oauth2/authorize', params={'client_id': 'client_12345', 'response_type': 'code', 'redirect_uri': 'https://localhost/'})
+        r = self.app.get('/auth/oauth2/authorize', params={
+            'client_id': 'client_12345',
+            'response_type': 'code',
+            'redirect_uri': 'https://localhost/',
+        })
         r = r.forms[0].submit('no')
         assert M.OAuth2AuthorizationCode.query.get(client_id='client_12345') is None
 
-
     @mock.patch.dict(config, {'auth.oauth2.enabled': True})
     def test_authorize_and_create_access_token(self):
         # client owned by someone other than the test-admin user that self.app.get/post use
@@ -2225,7 +2232,11 @@ class TestOAuth2(TestController):
         r.mustcontain(no='testoauth2')
 
         # First navigate to the authorization page for the backend to validate the authorization request
-        r = self.app.get('/auth/oauth2/authorize', params={'client_id': 'client_12345', 'response_type': 'code', 'redirect_uri': 'https://localhost/'})
+        r = self.app.get('/auth/oauth2/authorize', params={
+            'client_id': 'client_12345',
+            'response_type': 'code',
+            'redirect_uri': 'https://localhost/',
+        })
         # The submit authorization for the authorization code to be created
         r.forms[0].submit('yes')
 
@@ -2251,7 +2262,6 @@ class TestOAuth2(TestController):
         r = self.app.get('/auth/oauth/')
         r.mustcontain('testoauth2')
 
-
     @mock.patch.dict(config, {'auth.oauth2.enabled': True})
     def test_revoke_auth_code(self):
         # only the auth code is present, and it gets revoked
@@ -2287,7 +2297,6 @@ class TestOAuth2(TestController):
         r = self.app.get('/auth/oauth/')
         r.mustcontain(no='testoauth2')
 
-
     @mock.patch.dict(config, {'auth.oauth2.enabled': True})
     def test_revoke_access_token(self):
         # both auth code and access token are present, both get revoked
@@ -2332,16 +2341,16 @@ class TestOAuth2(TestController):
         r = self.app.get('/auth/oauth/')
         r.mustcontain(no='testoauth2')
 
-
     @mock.patch.dict(config, {'auth.oauth2.enabled': True})
     def test_pkce(self, mock_client, mock_credentials):
         code_verifier = 'QkatVHgTq_cZj8tTKWPIe78fXpoeszhVq6kLIUxJj8g9tMmfi0XV4dfZHQBXwOiWsLihJotfrOGKR4nZSXA4mA'
         code_challenge = 'BxGpJVKt_l6Srlq3uXPfpxge3TxtxetcWhGXq2958yU'
-        code_challenge_method = 'S256' # Must be uppercase
+        code_challenge_method = 'S256'  # Must be uppercase
 
         # Authorize the app by sending the code challenge and code challenge method as qs param
-        params = dict(client_id='client_12345', response_type='code', redirect_uri='https://localhost/', code_challenge=code_challenge,
-                        code_challenge_method=code_challenge_method)
+        params = dict(client_id='client_12345', response_type='code', redirect_uri='https://localhost/',
+                      code_challenge=code_challenge,
+                      code_challenge_method=code_challenge_method)
         r = self.app.get('/auth/oauth2/authorize', params=params)
 
         # Authorize app
@@ -2352,7 +2361,8 @@ class TestOAuth2(TestController):
         assert ac is not None
 
         # Exchange the authorization code for an access token. It should fail if you do not provide the code verifier
-        body = dict(client_id='client_12345', client_secret='98765', code=ac.authorization_code, grant_type='authorization_code', redirect_uri='https://localhost/')
+        body = dict(client_id='client_12345', client_secret='98765', code=ac.authorization_code,
+                    grant_type='authorization_code', redirect_uri='https://localhost/')
 
         with pytest.raises(webtest.app.AppError) as ex:
             r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
@@ -2368,7 +2378,8 @@ class TestOAuth2(TestController):
     def test_refresh_token(self, mock_client, mock_valid_token):
         token = M.OAuth2AccessToken.query.get(client_id='client_12345')
 
-        body = dict(client_id='client_12345', client_secret='98765', grant_type='refresh_token', refresh_token=token.refresh_token)
+        body = dict(client_id='client_12345', client_secret='98765', grant_type='refresh_token',
+                    refresh_token=token.refresh_token)
         r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
         assert r.status_int == 200
         assert r.json['access_token'] != token.access_token
@@ -2376,7 +2387,8 @@ class TestOAuth2(TestController):
 
     @mock.patch.dict(config, {'auth.oauth2.enabled': True})
     def test_invalid_refresh_token(self, mock_client, mock_valid_token):
-        body = dict(client_id='client_12345', client_secret='98765', grant_type='refresh_token', refresh_token='invalid_token')
+        body = dict(client_id='client_12345', client_secret='98765', grant_type='refresh_token',
+                    refresh_token='invalid_token')
         with pytest.raises(webtest.app.AppError) as ex:
             r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
 
@@ -2387,8 +2399,8 @@ class TestOAuth2(TestController):
         c = M.OAuth2ClientApp.query.get(client_id='client_12345')
         ac = M.OAuth2AuthorizationCode.query.get(client_id='client_12345')
 
-        body = dict(client_id=c.client_id, client_secret=c.client_secret, grant_type='authorization_code', code=ac.authorization_code,
-                        redirect_uri=c.redirect_uris[0])
+        body = dict(client_id=c.client_id, client_secret=c.client_secret, grant_type='authorization_code',
+                    code=ac.authorization_code, redirect_uri=c.redirect_uris[0])
         with pytest.raises(webtest.app.AppError) as ex:
             r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
 
@@ -2399,8 +2411,8 @@ class TestOAuth2(TestController):
         c = M.OAuth2ClientApp.query.get(client_id='client_12345')
         ac = M.OAuth2AuthorizationCode.query.get(client_id='client_12345')
 
-        body = dict(client_id=c.client_id, client_secret=c.client_secret, grant_type='authorization_code', code=ac.authorization_code,
-                        redirect_uri='https://invalid.com')
+        body = dict(client_id=c.client_id, client_secret=c.client_secret, grant_type='authorization_code',
+                    code=ac.authorization_code, redirect_uri='https://invalid.com')
         with pytest.raises(webtest.app.AppError) as ex:
             r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
 
@@ -2412,8 +2424,8 @@ class TestOAuth2(TestController):
         ac = M.OAuth2AuthorizationCode.query.get(client_id='client_12345')
 
         # First test passing an invalid client id
-        body = dict(client_id='invalid_client_id', client_secret=c.client_secret, grant_type='authorization_code', code=ac.authorization_code,
-                        redirect_uri=c.redirect_uris[0])
+        body = dict(client_id='invalid_client_id', client_secret=c.client_secret, grant_type='authorization_code',
+                    code=ac.authorization_code, redirect_uri=c.redirect_uris[0])
 
         with pytest.raises(webtest.app.AppError) as ex:
             r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
@@ -2421,8 +2433,8 @@ class TestOAuth2(TestController):
         assert 'invalid_client' in str(ex.value)
 
         # Now test passing an invalid client secret
-        body = dict(client_id=c.client_id, client_secret='invalid_secret', grant_type='authorization_code', code=ac.authorization_code,
-                        redirect_uri=c.redirect_uris[0])
+        body = dict(client_id=c.client_id, client_secret='invalid_secret', grant_type='authorization_code',
+                    code=ac.authorization_code, redirect_uri=c.redirect_uris[0])
 
         with pytest.raises(webtest.app.AppError) as ex:
             r = self.app.post_json('/rest/oauth2/token', body, extra_environ={'username': '*anonymous'})
diff --git a/Allura/allura/tests/functional/test_feeds.py b/Allura/allura/tests/functional/test_feeds.py
index d3d2eaa1f..9949b5976 100644
--- a/Allura/allura/tests/functional/test_feeds.py
+++ b/Allura/allura/tests/functional/test_feeds.py
@@ -71,7 +71,7 @@ class TestFeeds(TestController):
             'title': 'Root',
             'text': '',
             'labels': '',
-            })
+        })
         self.app.get('/wiki/Root/feed.rss')
         self.app.get('/wiki/Root/feed.atom')
 
diff --git a/Allura/allura/tests/functional/test_personal_dashboard.py b/Allura/allura/tests/functional/test_personal_dashboard.py
index b6a68eb3d..68d64392d 100644
--- a/Allura/allura/tests/functional/test_personal_dashboard.py
+++ b/Allura/allura/tests/functional/test_personal_dashboard.py
@@ -87,7 +87,7 @@ class TestMergeRequestsSection(TestController):
         super().setup_method(method)
         setup_unit_test()
         self.setup_with_tools()
-        mr= self.merge_request
+        mr = self.merge_request
         ThreadLocalODMSession.flush_all()
 
     # variation on @with_git but with different project to avoid clashes with other tests using git
diff --git a/Allura/allura/tests/functional/test_rest.py b/Allura/allura/tests/functional/test_rest.py
index a5ceaeaae..9459ff40c 100644
--- a/Allura/allura/tests/functional/test_rest.py
+++ b/Allura/allura/tests/functional/test_rest.py
@@ -465,7 +465,7 @@ class TestRestHome(TestRestApiBase):
             r = self.api_get('/rest/p/test/wiki/Home')
             params = dict(text=r.json['text'])
             r = self.api_post('/rest/p/test/wiki/Home', params=params)
-            
+
         assert '401 Unauthorized' in str(ex.value)
 
 
diff --git a/Allura/allura/tests/functional/test_root.py b/Allura/allura/tests/functional/test_root.py
index d11568388..8c86769e7 100644
--- a/Allura/allura/tests/functional/test_root.py
+++ b/Allura/allura/tests/functional/test_root.py
@@ -191,7 +191,7 @@ class TestRootController(TestController):
     @skipIf(module_not_available('newrelic'), 'requires newrelic')
     def test_newrelic_set_transaction_name(self):
         from allura.controllers.project import NeighborhoodController
-        with mock.patch('newrelic.agent.callable_name') as callable_name,\
+        with mock.patch('newrelic.agent.callable_name') as callable_name, \
                 mock.patch('newrelic.agent.set_transaction_name') as set_transaction_name:
             callable_name.return_value = 'foo'
             self.app.get('/p/')
diff --git a/Allura/allura/tests/model/__init__.py b/Allura/allura/tests/model/__init__.py
index e2b83dcde..799fda96e 100644
--- a/Allura/allura/tests/model/__init__.py
+++ b/Allura/allura/tests/model/__init__.py
@@ -16,4 +16,3 @@
 #       under the License.
 
 """Model test suite for the models of the application."""
-
diff --git a/Allura/allura/tests/model/test_artifact.py b/Allura/allura/tests/model/test_artifact.py
index 33274bda6..9424f90f9 100644
--- a/Allura/allura/tests/model/test_artifact.py
+++ b/Allura/allura/tests/model/test_artifact.py
@@ -51,6 +51,8 @@ class Checkmessage(M.Message):
         super().__init__(**kw)
         if self.slug is not None and self.full_slug is None:
             self.full_slug = datetime.utcnow().strftime('%Y%m%d%H%M%S%f') + ':' + self.slug
+
+
 Mapper.compile_all()
 
 
diff --git a/Allura/allura/tests/model/test_auth.py b/Allura/allura/tests/model/test_auth.py
index 3a6ece759..7afb845d1 100644
--- a/Allura/allura/tests/model/test_auth.py
+++ b/Allura/allura/tests/model/test_auth.py
@@ -87,19 +87,19 @@ class TestAuth:
 
     def test_email_address_canonical(self):
         assert M.EmailAddress.canonical('nobody@EXAMPLE.COM') == \
-               'nobody@example.com'
+            'nobody@example.com'
         assert M.EmailAddress.canonical('nobody@example.com') == \
-               'nobody@example.com'
+            'nobody@example.com'
         assert M.EmailAddress.canonical('I Am Nobody <no...@example.com>') == \
-               'nobody@example.com'
+            'nobody@example.com'
         assert M.EmailAddress.canonical('  nobody@example.com\t') == \
-               'nobody@example.com'
+            'nobody@example.com'
         assert M.EmailAddress.canonical('I Am@Nobody <no...@example.com> ') == \
-               'nobody@example.com'
+            'nobody@example.com'
         assert M.EmailAddress.canonical(' No@body <no...@example.com> ') == \
-               'no@body@example.com'
+            'no@body@example.com'
         assert M.EmailAddress.canonical('no@body@example.com') == \
-               'no@body@example.com'
+            'no@body@example.com'
         assert M.EmailAddress.canonical('invalid') is None
 
     def test_email_address_send_verification_link(self):
diff --git a/Allura/allura/tests/model/test_discussion.py b/Allura/allura/tests/model/test_discussion.py
index 5cb6b764c..15b2ed6e1 100644
--- a/Allura/allura/tests/model/test_discussion.py
+++ b/Allura/allura/tests/model/test_discussion.py
@@ -599,4 +599,4 @@ class TestDiscussion:
 
         assert M.BaseAttachment.query.get(filename='discussion.txt')
         assert M.BaseAttachment.query.get(filename='thread.txt')
-        assert not M.BaseAttachment.query.get(filename='post.txt')
\ No newline at end of file
+        assert not M.BaseAttachment.query.get(filename='post.txt')
diff --git a/Allura/allura/tests/model/test_filesystem.py b/Allura/allura/tests/model/test_filesystem.py
index 60cd96aed..844a7b7b2 100644
--- a/Allura/allura/tests/model/test_filesystem.py
+++ b/Allura/allura/tests/model/test_filesystem.py
@@ -32,6 +32,8 @@ class File(M.File):
 
     class __mongometa__:
         session = M.session.main_orm_session
+
+
 Mapper.compile_all()
 
 
diff --git a/Allura/allura/tests/model/test_repo.py b/Allura/allura/tests/model/test_repo.py
index 7434f4b1b..a553eb3b5 100644
--- a/Allura/allura/tests/model/test_repo.py
+++ b/Allura/allura/tests/model/test_repo.py
@@ -445,14 +445,13 @@ class TestModelCache:
         tr_get.assert_called_once_with(_id='foo')
         assert val == tree1
 
-
     def test_set(self):
         tree = mock.Mock(spec=['_id', 'test_set'], _id='foo', val='test_set')
         self.cache.set(M.repository.Tree, {'val': 'test_set'}, tree)
         assert self.cache._query_cache == \
-                         {M.repository.Tree: {(('val', 'test_set'),): 'foo'}}
+            {M.repository.Tree: {(('val', 'test_set'),): 'foo'}}
         assert self.cache._instance_cache == \
-                         {M.repository.Tree: {'foo': tree}}
+            {M.repository.Tree: {'foo': tree}}
 
     @mock.patch('bson.ObjectId')
     def test_set_none_id(self, obj_id):
@@ -465,7 +464,7 @@ class TestModelCache:
             (('val2', 'test_set2'),): 'OBJID',
         }
         assert self.cache._instance_cache == \
-                         {M.repository.Tree: {'OBJID': tree}}
+            {M.repository.Tree: {'OBJID': tree}}
         tree._id = '_id'
         assert self.cache.get(M.repository.Tree, {'val1': 'test_set1'}) == tree
         assert self.cache.get(M.repository.Tree, {'val2': 'test_set2'}) == tree
@@ -503,7 +502,7 @@ class TestModelCache:
         self.cache.set(M.repository.Tree, {'val': 'tree1'}, tree1)
         self.cache.set(M.repository.Tree, {'val': 'tree2'}, tree2)
         assert set(self.cache.instance_ids(M.repository.Tree)) == \
-                         {'id1', 'id2'}
+            {'id1', 'id2'}
         assert self.cache.instance_ids(M.repository.LastCommit) == []
 
     @mock.patch.object(M.repository.Tree.query, 'find')
@@ -650,9 +649,9 @@ class TestModelCache:
             'tree2': tree2,
         }
         assert session.call_args_list == \
-                         [mock.call(tree1), mock.call(tree2)]
+            [mock.call(tree1), mock.call(tree2)]
         assert session.return_value.flush.call_args_list == \
-                         [mock.call(tree1), mock.call(tree2)]
+            [mock.call(tree1), mock.call(tree2)]
         assert not session.return_value.expunge.called
 
     @mock.patch('allura.model.repository.session')
diff --git a/Allura/allura/tests/scripts/__init__.py b/Allura/allura/tests/scripts/__init__.py
index 77505f1c3..144e29886 100644
--- a/Allura/allura/tests/scripts/__init__.py
+++ b/Allura/allura/tests/scripts/__init__.py
@@ -14,4 +14,3 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-
diff --git a/Allura/allura/tests/scripts/test_create_sitemap_files.py b/Allura/allura/tests/scripts/test_create_sitemap_files.py
index 8097f169e..07c858d8c 100644
--- a/Allura/allura/tests/scripts/test_create_sitemap_files.py
+++ b/Allura/allura/tests/scripts/test_create_sitemap_files.py
@@ -44,7 +44,7 @@ class TestCreateSitemapFiles:
             rmtree(tmpdir.path)  # needs to be non-existent for the script
             self.run_script(['-o', tmpdir.path])
 
-            tmpdir.compare(['sitemap-0.xml', 'sitemap.xml'],recursive=False, files_only=True)
+            tmpdir.compare(['sitemap-0.xml', 'sitemap.xml'], recursive=False, files_only=True)
 
             xml_index = ET.parse(os.path.join(tmpdir.path, 'sitemap.xml'))
             ns = {'ns0': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
diff --git a/Allura/allura/tests/templates/__init__.py b/Allura/allura/tests/templates/__init__.py
index 77505f1c3..144e29886 100644
--- a/Allura/allura/tests/templates/__init__.py
+++ b/Allura/allura/tests/templates/__init__.py
@@ -14,4 +14,3 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-
diff --git a/Allura/allura/tests/templates/jinja_master/__init__.py b/Allura/allura/tests/templates/jinja_master/__init__.py
index 77505f1c3..144e29886 100644
--- a/Allura/allura/tests/templates/jinja_master/__init__.py
+++ b/Allura/allura/tests/templates/jinja_master/__init__.py
@@ -14,4 +14,3 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-
diff --git a/Allura/allura/tests/test_globals.py b/Allura/allura/tests/test_globals.py
index c88623c5d..9f93a51f2 100644
--- a/Allura/allura/tests/test_globals.py
+++ b/Allura/allura/tests/test_globals.py
@@ -792,7 +792,7 @@ class TestCachedMarkdown:
         html = self.md.cached_convert(self.post, 'text')
         assert html == self.expected_html
         assert html == self.post.text_cache.html
-        assert hashlib.md5(self.post.text.encode('utf-8')).hexdigest()  == self.post.text_cache.md5
+        assert hashlib.md5(self.post.text.encode('utf-8')).hexdigest() == self.post.text_cache.md5
         assert self.post.text_cache.render_time > 0
 
     @patch.dict('allura.lib.app_globals.config', markdown_cache_threshold='-0.01')
diff --git a/Allura/allura/tests/test_helpers.py b/Allura/allura/tests/test_helpers.py
index 817abde69..d9f223479 100644
--- a/Allura/allura/tests/test_helpers.py
+++ b/Allura/allura/tests/test_helpers.py
@@ -16,7 +16,7 @@
 #       under the License.
 
 import io
-from unittest import  skipIf
+from unittest import skipIf
 from os import path
 from datetime import datetime, timedelta
 import time
@@ -47,6 +47,7 @@ from alluratest.controller import setup_basic_test
 # httpbin.io does not allow /redirect-to to localhost
 httpbin_domain = 'httpbin.dev'
 
+
 def setup_module():
     setup_basic_test()
 
@@ -628,7 +629,7 @@ class TestIterEntryPoints:
 
         with pytest.raises(ImportError, match=r'Ambiguous \[allura\] entry points detected. '
                                               'Multiple entry points with name "myapp".'):
-           list(h.iter_entry_points('allura'))
+            list(h.iter_entry_points('allura'))
 
 
 def test_get_user_status():
diff --git a/Allura/allura/tests/test_markdown.py b/Allura/allura/tests/test_markdown.py
index 3e56fe81e..5975d0d2d 100644
--- a/Allura/allura/tests/test_markdown.py
+++ b/Allura/allura/tests/test_markdown.py
@@ -131,4 +131,4 @@ Not *strong* or _underlined_."""
         md = markdown.Markdown(
             extensions=[mde.CommitMessageExtension(app), 'markdown.extensions.nl2br'],
             output_format='html')
-        assert md.convert(text) == expected_html
\ No newline at end of file
+        assert md.convert(text) == expected_html
diff --git a/Allura/allura/tests/test_plugin.py b/Allura/allura/tests/test_plugin.py
index 5bdaf5751..4118abb2e 100644
--- a/Allura/allura/tests/test_plugin.py
+++ b/Allura/allura/tests/test_plugin.py
@@ -638,9 +638,9 @@ class TestLocalAuthenticationProvider:
         assert ep('test_pass', '0000') == ('sha2560000j7pRjKKZ5L8G0jScZKja9ECmYF2zBV82Mi+E3wkop30=', 'allura_sha256')
 
     @pytest.mark.parametrize('algorithm,rounds,specific_salt,salt_len,expected_config', [
-        ('sha512_crypt', None,None, None, '$6$rounds=656000$'),
-        ('pbkdf2_sha256', None,None, None, '$pbkdf2-sha256$29000$'),
-        ('pbkdf2_sha512', None,None, None, '$pbkdf2-sha512$25000$'),
+        ('sha512_crypt', None, None, None, '$6$rounds=656000$'),
+        ('pbkdf2_sha256', None, None, None, '$pbkdf2-sha256$29000$'),
+        ('pbkdf2_sha512', None, None, None, '$pbkdf2-sha512$25000$'),
         # test with explicit # of rounds & salt_len
         ('pbkdf2_sha512', 26789, None, 50, '$pbkdf2-sha512$26789$'),
         ('bcrypt_sha256', None, 'O'*22, None, '$bcrypt-sha256$v=2,t=2b,r=12$'),
diff --git a/Allura/allura/tests/test_validators.py b/Allura/allura/tests/test_validators.py
index d4ca3031b..39d7a68e8 100644
--- a/Allura/allura/tests/test_validators.py
+++ b/Allura/allura/tests/test_validators.py
@@ -127,7 +127,7 @@ class TestAnonymousValidator:
         c.user = M.User.anonymous()
         with pytest.raises(fe.Invalid) as cm:
             self.val.to_python(True)
-        assert str(cm.value) ==  "Log in to Mark as Private"
+        assert str(cm.value) == "Log in to Mark as Private"
 
 
 class TestMountPointValidator:
@@ -210,7 +210,7 @@ class TestTaskValidator:
     def test_import_failure(self):
         with pytest.raises(fe.Invalid) as cm:
             self.val.to_python('allura.does.not.exist')
-        assert str(cm.value) =='Could not import "allura.does.not.exist"'
+        assert str(cm.value) == 'Could not import "allura.does.not.exist"'
 
     def test_attr_lookup_failure(self):
         with pytest.raises(fe.Invalid) as cm:
@@ -329,7 +329,7 @@ class TestIconValidator:
 
     def test_valid(self):
         input = self._mock('foo.png')
-        assert input  == self.val.to_python(input)
+        assert input == self.val.to_python(input)
 
         input = self._mock('foo.jpg')
         assert input == self.val.to_python(input)
diff --git a/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py b/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
index 388ba955e..2b9a01fff 100644
--- a/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
+++ b/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
@@ -51,7 +51,7 @@ class TestWhenModerating(WithDatabase):
         post = self.get_post()
         assert post.status == 'ok'
         assert (post.thread.last_post_date.strftime("%Y-%m-%d %H:%M:%S") ==
-                     mod_date.strftime("%Y-%m-%d %H:%M:%S"))
+                mod_date.strftime("%Y-%m-%d %H:%M:%S"))
 
     def test_that_it_can_mark_as_spam(self):
         self.moderate_post(spam=True)
diff --git a/Allura/allura/tests/unit/test_app.py b/Allura/allura/tests/unit/test_app.py
index 71b4e95f0..1e41f7a39 100644
--- a/Allura/allura/tests/unit/test_app.py
+++ b/Allura/allura/tests/unit/test_app.py
@@ -124,4 +124,4 @@ def install_app():
     # XXX: Remove project argument to install; it's redundant
     app = Application(project, app_config)
     app.install(project)
-    return app
\ No newline at end of file
+    return app
diff --git a/Allura/allura/tests/unit/test_artifact.py b/Allura/allura/tests/unit/test_artifact.py
index bac61bfd7..b8a1477d3 100644
--- a/Allura/allura/tests/unit/test_artifact.py
+++ b/Allura/allura/tests/unit/test_artifact.py
@@ -25,4 +25,4 @@ class TestArtifact:
         fields = {'name_t': '', 'shortname_s': ''}
         query = 'name:1 AND shortname:2 AND shortname_name_field:3'
         q = M.Artifact.translate_query(query, fields)
-        assert q  == 'name_t:1 AND shortname_s:2 AND shortname_name_field:3'
+        assert q == 'name_t:1 AND shortname_s:2 AND shortname_name_field:3'
diff --git a/Allura/allura/tests/unit/test_session.py b/Allura/allura/tests/unit/test_session.py
index e69e9737d..884f83f5e 100644
--- a/Allura/allura/tests/unit/test_session.py
+++ b/Allura/allura/tests/unit/test_session.py
@@ -167,7 +167,7 @@ class TestBatchIndexer:
         find.return_value = [m(_id=i) for i in (7, 8, 9)]
         self.ext.update_index(objs_deleted, arefs)
         assert self.ext.to_delete == \
-                         {o.index_id() for o in objs_deleted}
+            {o.index_id() for o in objs_deleted}
         assert self.ext.to_add == {4, 5, 6}
 
         # test deleting something that was previously added
@@ -175,7 +175,7 @@ class TestBatchIndexer:
         find.return_value = [m(_id=4)]
         self.ext.update_index(objs_deleted, [])
         assert self.ext.to_delete == \
-                         {o.index_id() for o in objs_deleted}
+            {o.index_id() for o in objs_deleted}
         assert self.ext.to_add == {5, 6}
 
     @mock.patch('allura.model.session.index_tasks')
diff --git a/Allura/allura/tests/unit/test_solr.py b/Allura/allura/tests/unit/test_solr.py
index 42c4643ce..83d6b167f 100644
--- a/Allura/allura/tests/unit/test_solr.py
+++ b/Allura/allura/tests/unit/test_solr.py
@@ -49,7 +49,7 @@ class TestSolr:
         calls = [mock.call('server1', auth=None),
                  mock.call('server2', auth=None),
                  mock.call('server3', auth=None),
-        ]
+                 ]
         pysolr.Solr.assert_has_calls(calls)
         assert len(solr.push_pool) == 2
 
diff --git a/Allura/allura/websetup/bootstrap.py b/Allura/allura/websetup/bootstrap.py
index c0e47e6db..18989a0b3 100644
--- a/Allura/allura/websetup/bootstrap.py
+++ b/Allura/allura/websetup/bootstrap.py
@@ -304,9 +304,11 @@ def clear_all_database_tables():
                 continue
             db.drop_collection(coll)
 
+
 # this re-uses hashes for the same pwd, which gives a huge speedup during tests.  Not good for real usage, since salting is the same.
 user_pwd_hash_speedup_cache = {}
 
+
 def fast_set_pwd(user: M.User, password: str):
     if password in user_pwd_hash_speedup_cache:
         user.password, user.password_algorithm = user_pwd_hash_speedup_cache[password]
@@ -315,6 +317,7 @@ def fast_set_pwd(user: M.User, password: str):
         user.set_password(password)
         user_pwd_hash_speedup_cache[password] = (user.password, user.password_algorithm)
 
+
 def create_user(display_name, username=None, password='foo', make_project=False):  # noqa: S107
     if not username:
         username = display_name.lower().replace(' ', '-')
@@ -328,7 +331,7 @@ def create_user(display_name, username=None, password='foo', make_project=False)
     em = EmailAddress.get(**kw)
     em.confirmed = True
     em.set_nonce_hash()
-    user.set_pref('email_address',email)
+    user.set_pref('email_address', email)
     fast_set_pwd(user, password)
     return user
 
diff --git a/Allura/ldap-setup.py b/Allura/ldap-setup.py
index e91343048..428f04078 100644
--- a/Allura/ldap-setup.py
+++ b/Allura/ldap-setup.py
@@ -110,6 +110,7 @@ def tempfile(template, values):
     yield name
     os.remove(name)
 
+
 backend_ldif = string.Template('''
 # Load dynamic backend modules
 dn: cn=module,cn=config
diff --git a/Allura/ldap-userconfig.py b/Allura/ldap-userconfig.py
index dd1c270c0..18fa32384 100644
--- a/Allura/ldap-userconfig.py
+++ b/Allura/ldap-userconfig.py
@@ -55,5 +55,6 @@ def upload(uname, pubkey):
     os.chown(keyfile, u.pw_uid, g.gr_gid)
     os.chmod(keyfile, 0o600)
 
+
 if __name__ == '__main__':
     main()
diff --git a/Allura/setup.py b/Allura/setup.py
index 63613d66a..e32efdeb0 100644
--- a/Allura/setup.py
+++ b/Allura/setup.py
@@ -26,7 +26,7 @@ lists, wiki pages, blogs and more for any number of individual projects.
 '''
 setup(
     name='Allura',
-    version=__version__, # noqa: F821
+    version=__version__,  # noqa: F821
     description='Base distribution of the Allura development platform',
     long_description=PROJECT_DESCRIPTION,
     author='Allura Team',
diff --git a/AlluraTest/alluratest/smtp_debug.py b/AlluraTest/alluratest/smtp_debug.py
index 65be0a162..377754bed 100644
--- a/AlluraTest/alluratest/smtp_debug.py
+++ b/AlluraTest/alluratest/smtp_debug.py
@@ -22,4 +22,4 @@ class BetterDebuggingServer(DebuggingServer):
 
     def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
         print('TO: ' + ', '.join(rcpttos))
-        super().process_message(peer, mailfrom, rcpttos, data)
\ No newline at end of file
+        super().process_message(peer, mailfrom, rcpttos, data)
diff --git a/AlluraTest/alluratest/test_syntax.py b/AlluraTest/alluratest/test_syntax.py
index 8124d7684..faebde60d 100644
--- a/AlluraTest/alluratest/test_syntax.py
+++ b/AlluraTest/alluratest/test_syntax.py
@@ -41,4 +41,3 @@ def test_run_precommit():
     code, outputs = run(cmd, dir=os.environ.get('ALLURA_GIT_DIR'))
     if code != 0:
         raise Exception(f'pre-commit failed to run: {outputs[0].decode()} {outputs[1].decode()}')
-
diff --git a/ForgeActivity/forgeactivity/tests/functional/test_root.py b/ForgeActivity/forgeactivity/tests/functional/test_root.py
index 41d5256f6..8b8443e89 100644
--- a/ForgeActivity/forgeactivity/tests/functional/test_root.py
+++ b/ForgeActivity/forgeactivity/tests/functional/test_root.py
@@ -54,7 +54,7 @@ class TestActivityController(TestController):
     def test_anon_read(self):
         r = self.app.get('/u/test-user-1',
                          extra_environ={'username': '*anonymous'}).follow()
-        assert r.html.select('div.profile-section.tools a[href="/u/test-user-1/activity/"]'),\
+        assert r.html.select('div.profile-section.tools a[href="/u/test-user-1/activity/"]'), \
             'No Activity tool in top nav'
 
     @td.with_tool('test', 'activity')
diff --git a/ForgeBlog/forgeblog/tests/test_commands.py b/ForgeBlog/forgeblog/tests/test_commands.py
index 4a1d797ec..174031c50 100644
--- a/ForgeBlog/forgeblog/tests/test_commands.py
+++ b/ForgeBlog/forgeblog/tests/test_commands.py
@@ -94,7 +94,7 @@ def test_pull_rss_feeds(urlopen):
         <title>Test html summary</title>
         <link href="http://example.com/"/>
         <updated>2003-12-13T18:30:02Z</updated>
-        <summary type="html">'''+ html_in_feed + b'''</summary>
+        <summary type="html">''' + html_in_feed + b'''</summary>
       </entry>
     </feed>''')
 
diff --git a/ForgeBlog/forgeblog/widgets.py b/ForgeBlog/forgeblog/widgets.py
index 3aa74a13d..c0445369c 100644
--- a/ForgeBlog/forgeblog/widgets.py
+++ b/ForgeBlog/forgeblog/widgets.py
@@ -39,7 +39,7 @@ class BlogPostForm(forms.ForgeForm):
         return ew_core.NameList([
             ew.TextField(name='title',
                          validator=v.UnicodeString(not_empty=True,
-                                                     messages={'empty': "You must provide a Title"}),
+                                                   messages={'empty': "You must provide a Title"}),
                          attrs=dict(placeholder='Enter your title here',
                                     title='Enter your title here',
                                     style='width: 425px')),
diff --git a/ForgeChat/forgechat/model/chat.py b/ForgeChat/forgechat/model/chat.py
index 03d1c0905..ba72930b8 100644
--- a/ForgeChat/forgechat/model/chat.py
+++ b/ForgeChat/forgechat/model/chat.py
@@ -93,4 +93,5 @@ class ChatMessage(M.Artifact):
     def timestamp_hour(self):
         return self.timestamp.strftime('%H:%M:%S')
 
+
 Mapper.compile_all()
diff --git a/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py b/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
index 1909b6d89..ed461f913 100644
--- a/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
+++ b/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
@@ -95,7 +95,7 @@ class ModerateThread(CsrfForm):
     submit_text = 'Save Changes'
 
     class fields(ew_core.NameList):
-        subject = ew.InputField(label='Change subject:', attrs={'style':'width: 50%'})
+        subject = ew.InputField(label='Change subject:', attrs={'style': 'width: 50%'})
         discussion = _ForumSelector(label='Move to different forum:')
         flags = ew.CheckboxSet(label='Options', options=['Sticky', 'Announcement'])
 
diff --git a/ForgeFeedback/forgefeedback/feedback_main.py b/ForgeFeedback/forgefeedback/feedback_main.py
index 07b937e27..21178ef5f 100644
--- a/ForgeFeedback/forgefeedback/feedback_main.py
+++ b/ForgeFeedback/forgefeedback/feedback_main.py
@@ -131,7 +131,7 @@ class RootController(BaseController, FeedController):
     @expose('jinja:forgefeedback:templates/feedback/index.html')
     def get_review_list(self, **kw):
         self.review_list = Feedback.query.find({'project_id': c.project._id})\
-                            .sort('created_date', pymongo.DESCENDING).all()
+            .sort('created_date', pymongo.DESCENDING).all()
         return self.review_list
 
     """ The new feedback given by the logged in user which includes
@@ -163,8 +163,8 @@ class RootController(BaseController, FeedController):
     @expose('jinja:forgefeedback:templates/feedback/edit_feedback.html')
     def edit_feedback(self, **kw):
         self.review = Feedback.query.find(
-                {'reported_by_id': c.user._id, 'project_id': c.project._id}
-                ).first()
+            {'reported_by_id': c.user._id, 'project_id': c.project._id}
+        ).first()
         return dict(description=self.review.description,
                     rating=self.review.rating)
 
@@ -192,7 +192,7 @@ class RootController(BaseController, FeedController):
     def delete_feedback(self, **kw):
         user_review = Feedback.query.find(
             {'reported_by_id': c.user._id, 'project_id': c.project._id}
-            ).first()
+        ).first()
         if user_review:
             Feedback.query.remove(dict(
                 {'reported_by_id': c.user._id, 'project_id': c.project._id}))
@@ -216,6 +216,7 @@ class RootController(BaseController, FeedController):
 
     """ This method count the number of stars finds their sum and
     calculates the average of all the star rating count """
+
     def getRating(self, **kw):
         onestarcount = TM.Feedback.query.find(
             {'rating': '1', 'project_id': c.project._id}).count()
diff --git a/ForgeFeedback/forgefeedback/tests/functional/test_root.py b/ForgeFeedback/forgefeedback/tests/functional/test_root.py
index b751eb7a3..902a5199f 100644
--- a/ForgeFeedback/forgefeedback/tests/functional/test_root.py
+++ b/ForgeFeedback/forgefeedback/tests/functional/test_root.py
@@ -20,7 +20,6 @@ from allura import model as M
 from alluratest.controller import TestController
 
 
-
 class TestFeedback(TestController):
 
     def test_feedback(self):
diff --git a/ForgeFeedback/setup.py b/ForgeFeedback/setup.py
index 241608e89..196098a9a 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeFeedback/setup.py
@@ -47,7 +47,3 @@ setup(name='ForgeFeedback',
 
       """,
       )
-
-
-
-
diff --git a/ForgeFiles/forgefiles/files_main.py b/ForgeFiles/forgefiles/files_main.py
index 7c91a6896..9279014e1 100755
--- a/ForgeFiles/forgefiles/files_main.py
+++ b/ForgeFiles/forgefiles/files_main.py
@@ -88,7 +88,6 @@ class FilesApp(Application):
 
 
 def get_parent_folders(linked_file_object=None):
-
     '''Returns the list of the parent folders for the current file or folder'''
 
     parent_folder = linked_file_object.parent_folder if linked_file_object else None
@@ -108,7 +107,6 @@ class FilesController(BaseController):
 
     @expose('jinja:forgefiles:templates/files.html')
     def index(self):
-
         '''Index method for the Root controller'''
 
         require_access(c.app, 'read')
@@ -136,7 +134,6 @@ class FilesController(BaseController):
                     subscribed=subscribed, parents=parents)
 
     def get_parent_folder_url(self, parent_folder_id):
-
         ''' Returns the url,parent_folder and id of parent_folder object if object is there'''
 
         if (parent_folder_id == 'None') or (not parent_folder_id):
@@ -152,7 +149,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def create_folder(self, parent_folder_id=None, folder_name=None):
-
         '''Controller method for creating a folder. The folder is stored in UploadFolder collection'''
 
         require_access(c.app, 'create')
@@ -179,7 +175,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def upload_file(self, parent_folder_id=None, file_upload=None, filename=None):
-
         '''Controller method for creating a folder. The folder is stored in UploadFolder collection'''
 
         require_access(c.app, 'create')
@@ -212,7 +207,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def delete_file(self, file_id=None):
-
         '''Controller method to delete a file'''
 
         file_object = UploadFiles.query.get(_id=ObjectId(file_id), app_config_id=c.app.config._id)
@@ -233,7 +227,6 @@ class FilesController(BaseController):
         return redirect(url)
 
     def delete_file_from_db(self, file_id=None):
-
         '''Method to delete a file from db'''
 
         file_object = UploadFiles.query.get(_id=ObjectId(file_id), app_config_id=c.app.config._id)
@@ -241,7 +234,6 @@ class FilesController(BaseController):
         file_object.delete()
 
     def delete_folder_recursively(self, folder_id):
-
         '''This method is called recursively to delete folder in a hierarchy'''
 
         sub_file_objects = UploadFiles.query.find(dict({
@@ -258,7 +250,6 @@ class FilesController(BaseController):
     @require_post()
     @expose('jinja:forgefiles:templates/files.html')
     def delete_folder(self, folder_id=None):
-
         '''Controller method to delete a folder'''
 
         folder_object = UploadFolder.query.get(_id=ObjectId(folder_id), app_config_id=c.app.config._id)
@@ -280,7 +271,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def link_file(self, file_id=None, status=None):
-
         '''Controller method to link a file to the download button'''
 
         linkable_file_object = UploadFiles.query.get(_id=ObjectId(file_id), app_config_id=c.app.config._id)
@@ -297,7 +287,6 @@ class FilesController(BaseController):
 
     @expose()
     def download_file(self, filename=None):
-
         '''Controller method to download a file'''
 
         if filename:
@@ -324,7 +313,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def edit_folder(self, folder_id=None, folder_name=None):
-
         '''Controller method to edit the folder name'''
 
         url = c.app.url
@@ -342,7 +330,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def edit_file(self, file_id=None, file_name=None):
-
         '''Controller method to edit the file name'''
 
         url = c.app.url
@@ -362,7 +349,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def publish_folder(self, folder_id=None, remarks=None):
-
         '''Controller which publishes the folder. It send update about the publishing of the folder.'''
 
         folder_object = UploadFolder.query.get(_id=ObjectId(folder_id), app_config_id=c.app.config._id)
@@ -409,7 +395,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def disable_folder(self, folder_id=None, status=None):
-
         '''Controller method to disable the folder.'''
 
         folder_object = UploadFolder.query.get(_id=ObjectId(folder_id), app_config_id=c.app.config._id)
@@ -440,7 +425,6 @@ class FilesController(BaseController):
     @require_post()
     @expose()
     def disable_file(self, file_id=None, status=None):
-
         '''Controller method to disable the file.'''
 
         file_object = UploadFiles.query.get(_id=ObjectId(file_id), app_config_id=c.app.config._id)
@@ -461,7 +445,6 @@ class FilesController(BaseController):
     @expose('json:')
     @require_post()
     def subscribe(self, subscribe=None, unsubscribe=None):
-
         '''Controller method that subscribes an user to the files plugin.'''
 
         if subscribe:
diff --git a/ForgeFiles/forgefiles/model/files.py b/ForgeFiles/forgefiles/model/files.py
index 43d0af0af..ee421a4b9 100755
--- a/ForgeFiles/forgefiles/model/files.py
+++ b/ForgeFiles/forgefiles/model/files.py
@@ -146,7 +146,6 @@ class UploadFiles(File):
     thumbnail_size = (255, 255)
     ArtifactType = Upload
 
-
     class __mongometa__:
         name = 'upload_files'
         session = project_orm_session
@@ -181,13 +180,11 @@ class UploadFiles(File):
 
     @property
     def artifact(self):
-
         '''Returns the Artifact object'''
 
         return self.ArtifactType.query.get(_id=self.artifact_id)
 
     def url(self):
-
         '''Returns the URL of the uploaded file'''
 
         parent_folder = self.parent_folder
diff --git a/ForgeFiles/forgefiles/tests/__init__.py b/ForgeFiles/forgefiles/tests/__init__.py
index 77505f1c3..144e29886 100644
--- a/ForgeFiles/forgefiles/tests/__init__.py
+++ b/ForgeFiles/forgefiles/tests/__init__.py
@@ -14,4 +14,3 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-
diff --git a/ForgeFiles/forgefiles/tests/functional/__init__.py b/ForgeFiles/forgefiles/tests/functional/__init__.py
index 77505f1c3..144e29886 100644
--- a/ForgeFiles/forgefiles/tests/functional/__init__.py
+++ b/ForgeFiles/forgefiles/tests/functional/__init__.py
@@ -14,4 +14,3 @@
 #       KIND, either express or implied.  See the License for the
 #       specific language governing permissions and limitations
 #       under the License.
-
diff --git a/ForgeFiles/forgefiles/tests/functional/test_root.py b/ForgeFiles/forgefiles/tests/functional/test_root.py
index fb38b7924..445590270 100644
--- a/ForgeFiles/forgefiles/tests/functional/test_root.py
+++ b/ForgeFiles/forgefiles/tests/functional/test_root.py
@@ -132,7 +132,7 @@ def upload_file(self):
     path = dir.write('myfile.txt', b'Testing Upload')
     with open(path, 'rb') as f:
         file_upload = [('file_upload', 'myfile.txt', f.read())]
-        filename_dict = {'filename':'myfile.txt'}
+        filename_dict = {'filename': 'myfile.txt'}
         self.app.post('/p/test/files/upload_file', filename_dict, upload_files=file_upload)
     file_object = UploadFiles.query.get(filename='myfile.txt')
     dir.cleanup()
diff --git a/ForgeFiles/forgefiles/tests/model/__init__.py b/ForgeFiles/forgefiles/tests/model/__init__.py
index 820aea361..1b0a08cb6 100644
--- a/ForgeFiles/forgefiles/tests/model/__init__.py
+++ b/ForgeFiles/forgefiles/tests/model/__init__.py
@@ -48,4 +48,3 @@ class FilesTestWithModel:
 
     def teardown_method(self, method):
         ThreadLocalODMSession.close_all()
-
diff --git a/ForgeGit/forgegit/tests/test_tasks.py b/ForgeGit/forgegit/tests/test_tasks.py
index 48ab369bd..96297b3bf 100644
--- a/ForgeGit/forgegit/tests/test_tasks.py
+++ b/ForgeGit/forgegit/tests/test_tasks.py
@@ -99,4 +99,3 @@ class TestCoreAlluraTasks(GitRealDataBaseTestCase):
 
         # mostly just making sure nothing errored, but here's at least one thing we can assert:
         assert repo.status == 'ready'
-
diff --git a/ForgeImporters/forgeimporters/forge/discussion.py b/ForgeImporters/forgeimporters/forge/discussion.py
index 61db6253d..50dd9d0b6 100644
--- a/ForgeImporters/forgeimporters/forge/discussion.py
+++ b/ForgeImporters/forgeimporters/forge/discussion.py
@@ -68,10 +68,10 @@ class ForgeDiscussionImportController(ToolImportController):
     def create(self, discussions_json, mount_point, mount_label, **kw):
         if self.importer.enforce_limit(c.project):
             save_importer_upload(
-                            c.project,
-                            'discussions.json',
-                            json.dumps(discussions_json)
-                        )
+                c.project,
+                'discussions.json',
+                json.dumps(discussions_json)
+            )
             self.importer.post(mount_point=mount_point, mount_label=mount_label)
             flash('Discussion import has begun. Your new discussion will be available when the import is complete')
         else:
@@ -113,15 +113,15 @@ class ForgeDiscussionImporter(AlluraImporter):
                 for forum_json in discussion_json['forums']:
 
                     new_forum = dict(
-                                    app_config_id=app.config._id,
-                                    shortname=forum_json['shortname'],
-                                    description=forum_json['description'],
-                                    name=forum_json['name'],
-                                    create='on',
-                                    parent='',
-                                    members_only=False,
-                                    anon_posts=False,
-                                    monitoring_email=None,
+                        app_config_id=app.config._id,
+                        shortname=forum_json['shortname'],
+                        description=forum_json['description'],
+                        name=forum_json['name'],
+                        create='on',
+                        parent='',
+                        members_only=False,
+                        anon_posts=False,
+                        monitoring_email=None,
                     )
 
                     forum = utils.create_forum(app, new_forum=new_forum)
@@ -194,19 +194,19 @@ class ForgeDiscussionImporter(AlluraImporter):
                                 break
 
                 p = thread.add_post(
-                        subject=post_json['subject'],
-                        text=self.annotate_text(post_json['text'], user, username),
-                        timestamp=timestamp,
-                        ignore_security=True,
-                        parent_id=parent_id
+                    subject=post_json['subject'],
+                    text=self.annotate_text(post_json['text'], user, username),
+                    timestamp=timestamp,
+                    ignore_security=True,
+                    parent_id=parent_id
                 )
 
                 if ("last_edited" in post_json) and (post_json["last_edited"] is not None):
                     p.last_edit_date = parse(post_json["last_edited"])
 
                 p.add_multiple_attachments(
-                        [File(a["url"]) for a in post_json["attachments"]]
-                    )
+                    [File(a["url"]) for a in post_json["attachments"]]
+                )
 
                 if slug != '':
                     created_posts.append({slug: p})
diff --git a/ForgeImporters/forgeimporters/github/tests/test_utils.py b/ForgeImporters/forgeimporters/github/tests/test_utils.py
index f8c45cd02..c2ace0429 100644
--- a/ForgeImporters/forgeimporters/github/tests/test_utils.py
+++ b/ForgeImporters/forgeimporters/github/tests/test_utils.py
@@ -51,7 +51,7 @@ class TestGitHubMarkdownConverter:
         text = 'user/p@16c999e8c71134401a78d4d46435517b2271d6ac'
         result = self.conv.convert(text)
         assert (result == '[user/p@16c999]'
-                             '(https://github.com/user/p/commit/16c999e8c71134401a78d4d46435517b2271d6ac)')
+                '(https://github.com/user/p/commit/16c999e8c71134401a78d4d46435517b2271d6ac)')
 
     def test_convert_ticket(self):
         text = 'Ticket #1'
diff --git a/ForgeImporters/forgeimporters/github/tests/test_wiki.py b/ForgeImporters/forgeimporters/github/tests/test_wiki.py
index 647b1b2d5..d3b53dbda 100644
--- a/ForgeImporters/forgeimporters/github/tests/test_wiki.py
+++ b/ForgeImporters/forgeimporters/github/tests/test_wiki.py
@@ -15,7 +15,7 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from unittest import  skipIf
+from unittest import skipIf
 from mock import Mock, patch, call
 from ming.odm import ThreadLocalODMSession
 import git
diff --git a/ForgeImporters/forgeimporters/tests/forge/test_discussion.py b/ForgeImporters/forgeimporters/tests/forge/test_discussion.py
index 70464f5e5..bcbed57e6 100644
--- a/ForgeImporters/forgeimporters/tests/forge/test_discussion.py
+++ b/ForgeImporters/forgeimporters/tests/forge/test_discussion.py
@@ -113,19 +113,19 @@ class TestDiscussionImporter:
 
         utils.create_forum.assert_called_once_with(app, new_forum=new_forum)
         forum.get_discussion_thread(
-              dict(headers=dict(Subject=_json["forums"][0]["threads"][0]["subject"])))
+            dict(headers=dict(Subject=_json["forums"][0]["threads"][0]["subject"])))
         importer.add_posts.assert_called_once_with(
-                                    thread1,
-                                    _json["forums"][0]["threads"][0]["posts"],
-                                    app
+            thread1,
+            _json["forums"][0]["threads"][0]["posts"],
+            app
         )
 
         m.AuditLog.log.assert_called_once_with(
-                        "import tool mount_point from exported Allura JSON",
-                        project=project,
-                        user=user,
-                        url='foo'
-                    )
+            "import tool mount_point from exported Allura JSON",
+            project=project,
+            user=user,
+            url='foo'
+        )
         g.post_event.assert_called_once_with("project_updated")
 
     @mock.patch.object(discussion, 'c')
@@ -160,10 +160,10 @@ class TestDiscussionImporter:
                             "slug": "0e0e",
                             "subject": "post with un\u00ef\u00e7\u00f8\u2202\u00e9"
                         }],
-                        "page": None,
-                        "subject": "post with un\u00ef\u00e7\u00f8\u2202\u00e9"
-                    }]
+                    "page": None,
+                    "subject": "post with un\u00ef\u00e7\u00f8\u2202\u00e9"
                 }]
+            }]
         }
 
         importer._load_json = mock.Mock(return_value=_json)
@@ -202,7 +202,7 @@ class TestDiscussionImporter:
         utils.create_forum.assert_called_once_with(app, new_forum=new_forum)
         forum.get_discussion_thread.assert_called_once_with(dict(
             headers=dict(Subject=_json["forums"][0]["threads"][0]["subject"])
-            ))
+        ))
 
         importer.get_user.assert_called_once_with('admin1')
 
@@ -220,9 +220,9 @@ class TestDiscussionImporter:
             parent_id=None
         )
         importer.annotate_text.assert_called_once_with(
-                post["text"],
-                admin,
-                post["author"]
+            post["text"],
+            admin,
+            post["author"]
         )
         p.add_multiple_attachments.assert_called_once_with([])
 
@@ -332,29 +332,29 @@ class TestDiscussionImporter:
                             "subject": "Thread0",
                             "posts": []
                         },
-                        {
+                    {
                             "page": None,
                             "subject": "Thread1",
                             "posts": []
-                        },
-                        {
+                            },
+                    {
                             "page": None,
                             "subject": "Thread2",
                             "posts": []
-                        },
-                        {
+                            },
+                    {
                             "page": None,
                             "subject": "Thread3",
                             "posts": []
-                        },
-                        {
+                            },
+                    {
                             "page": None,
                             "subject": "Thread4",
                             "posts": []
-                        }
-                    ]}
-                ]
-            }
+                            }
+                ]}
+            ]
+        }
 
         importer._load_json = mock.Mock(return_value=_json)
         importer.add_posts = mock.Mock()
@@ -380,10 +380,10 @@ class TestDiscussionImporter:
         importer.import_tool(project, user, 'mount_point', 'mount_label')
 
         project.install_app.assert_called_once_with(
-                'discussion',
-                'mount_point',
-                'mount_label',
-                import_id={'source': 'Allura'}
+            'discussion',
+            'mount_point',
+            'mount_label',
+            import_id={'source': 'Allura'}
         )
         h.push_config.assert_called_once_with(c, app=app)
 
@@ -422,7 +422,7 @@ class TestDiscussionImporter:
                 "name": "General Discussion",
                 "import_id": import_id,
                 "threads": []
-                }]
+            }]
         }
 
         importer._load_json = mock.Mock(return_value=_json)
@@ -492,8 +492,8 @@ class TestDiscussionImporter:
                         "posts": [],
                         "subject": "Thread",
                         "import_id": import_id
-                    }]
                 }]
+            }]
         }
 
         importer._load_json = mock.Mock(return_value=_json)
@@ -532,8 +532,8 @@ class TestDiscussionImporter:
                         "limit": None,
                         "posts": [],
                         "subject": "Thread",
-                    }]
                 }]
+            }]
         }
 
         importer._load_json = mock.Mock(return_value=_json)
@@ -635,7 +635,7 @@ class TestDiscussionImporter:
                 "description": "Description of forum",
                 "name": "General Discussion",
                 "threads": [{
-                   "posts": []
+                    "posts": []
                 }]
             }]
         }
@@ -680,11 +680,11 @@ class TestDiscussionImporter:
         importer.get_user.assert_called_once_with('admin1')
         h.push_config.assert_called_once_with(c, user=user, app=app)
         thread.add_post.assert_called_once_with(
-                subject=_json[0]['subject'],
-                text='foo',
-                timestamp=parse(_json[0]['timestamp']),
-                ignore_security=True,
-                parent_id=None
+            subject=_json[0]['subject'],
+            text='foo',
+            timestamp=parse(_json[0]['timestamp']),
+            ignore_security=True,
+            parent_id=None
         )
         post.add_multiple_attachments.assert_called_once_with([])
 
@@ -937,54 +937,54 @@ class TestDiscussionImporter:
 
         _json = [
             {
-              "attachments": [],
-              "author": "admin1",
-              "timestamp": "2020-01-29 22:39:31.483000",
-              "text": "hi",
-              "slug": "0d1d",
-              "subject": "topic with lots of replies"
+                "attachments": [],
+                "author": "admin1",
+                "timestamp": "2020-01-29 22:39:31.483000",
+                "text": "hi",
+                "slug": "0d1d",
+                "subject": "topic with lots of replies"
             },
             {
-              "attachments": [],
-              "author": "admin1",
-              "timestamp": "2020-01-29 22:39:43.525000",
-              "text": "hello",
-              "slug": "0d1d/d421",
-              "subject": "topic with lots of replies"
+                "attachments": [],
+                "author": "admin1",
+                "timestamp": "2020-01-29 22:39:43.525000",
+                "text": "hello",
+                "slug": "0d1d/d421",
+                "subject": "topic with lots of replies"
             },
             {
-              "attachments": [],
-              "author": "admin1",
-              "timestamp": "2020-01-29 22:39:50.086000",
-              "text": "goodbye",
-              "slug": "0d1d/d421/f37d",
-              "subject": "topic with lots of replies"
+                "attachments": [],
+                "author": "admin1",
+                "timestamp": "2020-01-29 22:39:50.086000",
+                "text": "goodbye",
+                "slug": "0d1d/d421/f37d",
+                "subject": "topic with lots of replies"
             },
             {
-              "attachments": [],
-              "author": "admin1",
-              "timestamp": "2020-01-29 22:42:13.740000",
-              "text": "hi again",
-              "slug": "012f",
-              "subject": "topic with lots of replies"
+                "attachments": [],
+                "author": "admin1",
+                "timestamp": "2020-01-29 22:42:13.740000",
+                "text": "hi again",
+                "slug": "012f",
+                "subject": "topic with lots of replies"
             },
             {
-              "attachments": [],
-              "author": "user02",
-              "timestamp": "2020-01-29 22:42:51.645000",
-              "text": "hi there",
-              "slug": "012f/211a",
-              "subject": "topic with lots of replies"
+                "attachments": [],
+                "author": "user02",
+                "timestamp": "2020-01-29 22:42:51.645000",
+                "text": "hi there",
+                "slug": "012f/211a",
+                "subject": "topic with lots of replies"
             },
             {
-              "attachments": [],
-              "author": "user02",
-              "timestamp": "2020-01-29 22:42:58.478000",
-              "text": "hi here",
-              "slug": "0d1d/00a0",
-              "subject": "topic with lots of replies"
+                "attachments": [],
+                "author": "user02",
+                "timestamp": "2020-01-29 22:42:58.478000",
+                "text": "hi here",
+                "slug": "0d1d/00a0",
+                "subject": "topic with lots of replies"
             }
-         ]
+        ]
 
         importer.add_posts(thread, _json, app)
 
diff --git a/ForgeImporters/forgeimporters/tests/forge/test_tracker.py b/ForgeImporters/forgeimporters/tests/forge/test_tracker.py
index 7cb5e1741..9f5bff000 100644
--- a/ForgeImporters/forgeimporters/tests/forge/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/forge/test_tracker.py
@@ -299,7 +299,7 @@ class TestTrackerImporter:
         importer.process_comments(ticket, comments)
 
         assert importer.get_user.call_args_list == \
-                         [mock.call('a1'), mock.call('a2')]
+            [mock.call('a1'), mock.call('a2')]
         assert importer.annotate.call_args_list == [
             mock.call('t1', author, 'a1'),
             mock.call('t2', author, 'a2'),
@@ -341,7 +341,7 @@ class TestForgeTrackerImportController(TestController):
         super().setup_method(method)
         from forgetracker.tracker_main import TrackerAdminController
         TrackerAdminController._importer = \
-                tracker.ForgeTrackerImportController(tracker.ForgeTrackerImporter())
+            tracker.ForgeTrackerImportController(tracker.ForgeTrackerImporter())
 
     @with_tracker
     def test_index(self):
diff --git a/ForgeImporters/forgeimporters/tests/github/functional/test_github.py b/ForgeImporters/forgeimporters/tests/github/functional/test_github.py
index d9ed29b8f..be2e77130 100644
--- a/ForgeImporters/forgeimporters/tests/github/functional/test_github.py
+++ b/ForgeImporters/forgeimporters/tests/github/functional/test_github.py
@@ -91,7 +91,6 @@ class TestGitHubOAuth(TestController):
                                                         json={'access_token': 'abc'},
                                                         timeout=10)
 
-
     def test_project_import_login_required(self):
         r = self.app.get('/p/import_project/github/', extra_environ=dict(username='*anonymous'))
         assert r.location is None
diff --git a/ForgeImporters/forgeimporters/tests/github/test_tracker.py b/ForgeImporters/forgeimporters/tests/github/test_tracker.py
index 70164494c..28c3a4e74 100644
--- a/ForgeImporters/forgeimporters/tests/github/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/github/test_tracker.py
@@ -97,7 +97,7 @@ class TestTrackerImporter:
             importer.process_fields(extractor, ticket, issue)
             assert ticket.summary == 'title'
             assert ticket.description == \
-                             '*Originally created by:* [creator](https://github.com/creator)\n*Originally owned by:* [owner](https://github.com/owner)\n\nhello'
+                '*Originally created by:* [creator](https://github.com/creator)\n*Originally owned by:* [owner](https://github.com/owner)\n\nhello'
             assert ticket.status == 'New'
             assert ticket.created_date == 'created_at'
             assert ticket.mod_date == 'updated_at'
diff --git a/ForgeImporters/forgeimporters/tests/test_base.py b/ForgeImporters/forgeimporters/tests/test_base.py
index 7467613c9..022c36c23 100644
--- a/ForgeImporters/forgeimporters/tests/test_base.py
+++ b/ForgeImporters/forgeimporters/tests/test_base.py
@@ -150,7 +150,7 @@ class TestProjectImporter:
         pi = base.ProjectImporter(mock.Mock(name='neighborhood'))
         pi.source = 'foo'
         assert pi.tool_importers == \
-                         {'ep1': eps[0].lv, 'ep3': eps[2].lv}
+            {'ep1': eps[0].lv, 'ep3': eps[2].lv}
         iep.assert_called_once_with('allura.importers')
 
     @mock.patch.object(base.ToolImporter, 'by_name')
@@ -307,7 +307,7 @@ class TestToolsValidator:
         with pytest.raises(Invalid) as cm:
             self.tv.to_python(['value1', 'value2', 'value3'])
         assert cm.value.msg == \
-                         'Invalid tools selected: value1, value3'
+            'Invalid tools selected: value1, value3'
         assert by_name.call_args_list == [
             mock.call('value1'),
             mock.call('value2'),
diff --git a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
index 9cdadba1c..5da9166a1 100644
--- a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
@@ -18,7 +18,7 @@
 import json
 import os
 
-from unittest import  skipIf
+from unittest import skipIf
 
 import pytest
 from mock import Mock, patch
@@ -142,9 +142,9 @@ class TestTracTicketImportController(TestController):
         assert \
             'mylabel' == import_tool.post.call_args[1]['mount_label']
         assert '{"orig_user": "new_user"}' == \
-                         import_tool.post.call_args[1]['user_map']
+            import_tool.post.call_args[1]['user_map']
         assert 'http://example.com/trac/url/' == \
-                         import_tool.post.call_args[1]['trac_url']
+            import_tool.post.call_args[1]['trac_url']
 
     @with_tracker
     @patch('forgeimporters.trac.requests.head')
@@ -192,6 +192,7 @@ class TestTracTicketImportController(TestController):
         r = self.app.post('/p/test/admin/ext/import/trac-tickets/create', params, status=200)
         assert 'Invalid URL' in r.text
 
+
 class TestTracImportSupport:
 
     def test_link_processing(self):
@@ -288,7 +289,7 @@ class TestTracImportSupportFunctional(TestRestApiBase):
         ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
                                      ticket_num=390)
         assert 'To reproduce:  \n\\- open an mzML file' in \
-                      ticket.description
+            ticket.description
         assert 'duplicate of:  \n\\- [#316](316 "defect: SpectraViewWidget is' in \
-                      ticket.discussion_thread.find_posts()[0].text
+            ticket.discussion_thread.find_posts()[0].text
         assert 'will crash TOPPView.' in ticket.description
diff --git a/ForgeSVN/forgesvn/tests/functional/test_auth.py b/ForgeSVN/forgesvn/tests/functional/test_auth.py
index 7a64dc229..b235d7688 100644
--- a/ForgeSVN/forgesvn/tests/functional/test_auth.py
+++ b/ForgeSVN/forgesvn/tests/functional/test_auth.py
@@ -39,7 +39,7 @@ class TestSVNAuth(TestController):
 
         r = self.app.get('/auth/refresh_repo/p/test/src/')
         assert (r.text ==
-                     '<Repository /tmp/svn/p/test/src> refresh queued.\n')
+                '<Repository /tmp/svn/p/test/src> refresh queued.\n')
 
 
 class TestSVNUserPermissions(TestController):
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index f1e95c18e..631deea82 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -217,7 +217,7 @@ class TestSVNRepo(RepoImplTestBase):
             os.path.join(g.tmpdir, 'testsvn/hooks/post-commit'), os.X_OK)
         with open(os.path.join(g.tmpdir, 'testsvn/hooks/post-commit')) as f:
             c = f.read()
-        assert  'curl -s http://localhost/auth/refresh_repo/p/test/src/\n' in c
+        assert 'curl -s http://localhost/auth/refresh_repo/p/test/src/\n' in c
         assert 'exec $DIR/post-commit-user "$@"\n' in c
 
         repo.refresh(notify=False)
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index abfe426bd..8c3ae4252 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -220,7 +220,7 @@ class ImportSupport:
             owner = '*Originally owned by:* {}\n'.format(
                     h.really_unicode(ticket_dict['assigned_to']))
         remapped['description'] = '{}{}{}{}'.format(creator, owner,
-                                                         '\n' if creator or owner else '', description)
+                                                    '\n' if creator or owner else '', description)
 
         ticket_num = ticket_dict['id']
         existing_ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
diff --git a/ForgeTracker/forgetracker/search.py b/ForgeTracker/forgetracker/search.py
index d215cc631..4c6ed7838 100644
--- a/ForgeTracker/forgetracker/search.py
+++ b/ForgeTracker/forgetracker/search.py
@@ -41,7 +41,7 @@ def query_filter_choices(arg=None, fq=[]):
             'project_id_s:%s' % c.project._id,
             'mount_point_s:%s' % c.app.config.options.mount_point,
             'type_s:Ticket',
-            ] + fq,
+        ] + fq,
         'rows': 0,
     }
     params.update(FACET_PARAMS)
diff --git a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
index f580797fb..2f886a01f 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
@@ -230,7 +230,7 @@ class TestTicketModel(TrackerTestWithModel):
         assert f.pubdate == datetime(2012, 10, 29, 9, 57, 21, 465000)
         assert f.title == 'test ticket'
         assert (f.description ==
-                     '<div class="markdown_content"><p>test description</p></div>')
+                '<div class="markdown_content"><p>test description</p></div>')
 
     @td.with_tool('test', 'Tickets', 'bugs', username='test-user')
     @td.with_tool('test', 'Tickets', 'bugs2', username='test-user')
diff --git a/ForgeTracker/forgetracker/widgets/ticket_search.py b/ForgeTracker/forgetracker/widgets/ticket_search.py
index effa98f3b..e14ebf7da 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_search.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_search.py
@@ -22,7 +22,6 @@ from allura.lib.widgets import form_fields as ffw
 from allura.lib.widgets import forms
 
 
-
 class TicketSearchResults(ew_core.SimpleForm):
     template = 'jinja:forgetracker:templates/tracker_widgets/ticket_search_results.html'
     defaults = dict(
diff --git a/ForgeUserStats/forgeuserstats/tests/test_model.py b/ForgeUserStats/forgeuserstats/tests/test_model.py
index 9842cc642..fe2aa759e 100644
--- a/ForgeUserStats/forgeuserstats/tests/test_model.py
+++ b/ForgeUserStats/forgeuserstats/tests/test_model.py
@@ -472,10 +472,10 @@ class TestUserStats:
         )
         stats.addCommit(newcommit, commit_datetime, project)
         assert stats.general[0].commits[0] == \
-                         {'lines': 3, 'number': 1, 'language': None}
+            {'lines': 3, 'number': 1, 'language': None}
         unified_diff.reset_mock()
         with h.push_config(config, **{'userstats.count_lines_of_code': 'false'}):
             stats.addCommit(newcommit, commit_datetime, project)
         assert stats.general[0].commits[0] == \
-                         {'lines': 3, 'number': 2, 'language': None}
+            {'lines': 3, 'number': 2, 'language': None}
         assert not unified_diff.called
diff --git a/ForgeWiki/forgewiki/model/wiki.py b/ForgeWiki/forgewiki/model/wiki.py
index 5b6d0e682..712857eaf 100644
--- a/ForgeWiki/forgewiki/model/wiki.py
+++ b/ForgeWiki/forgewiki/model/wiki.py
@@ -297,4 +297,5 @@ class WikiAttachment(BaseAttachment):
 
     attachment_type = FieldProperty(str, if_missing='WikiAttachment')
 
+
 Mapper.compile_all()
diff --git a/ForgeWiki/forgewiki/tests/test_models.py b/ForgeWiki/forgewiki/tests/test_models.py
index 9a70504f2..58fa3cb28 100644
--- a/ForgeWiki/forgewiki/tests/test_models.py
+++ b/ForgeWiki/forgewiki/tests/test_models.py
@@ -42,6 +42,7 @@ class TestPageSnapshots(TestController):
         page.commit()
 
         lock = Lock()
+
         def run(n):
             setup_global_objects()
             for i in range(10):
diff --git a/conftest.py b/conftest.py
index 020af6a93..b4fc8ce7a 100644
--- a/conftest.py
+++ b/conftest.py
@@ -17,6 +17,8 @@
 import pytest
 
 # should get rid of this once this issue is fixed https://github.com/TurboGears/tg2/issues/136
+
+
 @pytest.fixture(autouse=True, scope='session')
 def tg_context_patch():
     from tg import (
@@ -37,4 +39,3 @@ def tg_context_patch():
     translator.__dict__['_is_coroutine'] = False
     url.__dict__['_is_coroutine'] = False
     config.__dict__['_is_coroutine'] = False
-                      
\ No newline at end of file
diff --git a/scripts/changelog.py b/scripts/changelog.py
index 6d4c2a7e9..d5e01456f 100755
--- a/scripts/changelog.py
+++ b/scripts/changelog.py
@@ -74,5 +74,6 @@ def print_changelog(version, summaries, changes_without_tickets):
     for change in changes_without_tickets:
         print(f" * {six.ensure_text(change)}")
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/013-update-ordinals.py b/scripts/migrations/013-update-ordinals.py
index 666696327..8bdeff1eb 100644
--- a/scripts/migrations/013-update-ordinals.py
+++ b/scripts/migrations/013-update-ordinals.py
@@ -69,5 +69,6 @@ def main():
         ThreadLocalODMSession.flush_all()
         ThreadLocalODMSession.close_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/015-add-neighborhood_id-to-blog-posts.py b/scripts/migrations/015-add-neighborhood_id-to-blog-posts.py
index 88d324e74..83c3dea01 100644
--- a/scripts/migrations/015-add-neighborhood_id-to-blog-posts.py
+++ b/scripts/migrations/015-add-neighborhood_id-to-blog-posts.py
@@ -34,5 +34,6 @@ def main():
         ThreadLocalODMSession.flush_all()
     ThreadLocalODMSession.close_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/020-remove-wiki-title-slashes.py b/scripts/migrations/020-remove-wiki-title-slashes.py
index 08b1bb6f9..99d192aed 100644
--- a/scripts/migrations/020-remove-wiki-title-slashes.py
+++ b/scripts/migrations/020-remove-wiki-title-slashes.py
@@ -35,5 +35,6 @@ def main():
         print('Updated: %s' % page.title)
     ThreadLocalODMSession.flush_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/022-change-anon-display-name.py b/scripts/migrations/022-change-anon-display-name.py
index 2d43cacbf..6c007cc5d 100644
--- a/scripts/migrations/022-change-anon-display-name.py
+++ b/scripts/migrations/022-change-anon-display-name.py
@@ -26,5 +26,6 @@ def main():
     ThreadLocalODMSession.flush_all()
     ThreadLocalODMSession.close_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/024-migrate-custom-profile-text.py b/scripts/migrations/024-migrate-custom-profile-text.py
index de480c89d..b859756ed 100644
--- a/scripts/migrations/024-migrate-custom-profile-text.py
+++ b/scripts/migrations/024-migrate-custom-profile-text.py
@@ -80,5 +80,6 @@ def main():
 
         ThreadLocalODMSession.flush_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/025-add-is-nbhd-project.py b/scripts/migrations/025-add-is-nbhd-project.py
index ca3fc77bb..0f29c284b 100644
--- a/scripts/migrations/025-add-is-nbhd-project.py
+++ b/scripts/migrations/025-add-is-nbhd-project.py
@@ -28,5 +28,6 @@ def main():
     M.Project.query.update({'shortname': {'$ne': '--init--'}},
                            {'$set': {'is_nbhd_project': False}}, multi=True)
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/026-install-activity-tool.py b/scripts/migrations/026-install-activity-tool.py
index 94eb6b31c..38024c50d 100644
--- a/scripts/migrations/026-install-activity-tool.py
+++ b/scripts/migrations/026-install-activity-tool.py
@@ -33,5 +33,6 @@ def main():
         ThreadLocalODMSession.flush_all()
         ThreadLocalODMSession.close_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/027-change-ticket-write-permissions.py b/scripts/migrations/027-change-ticket-write-permissions.py
index 6878f7add..3d8483f21 100644
--- a/scripts/migrations/027-change-ticket-write-permissions.py
+++ b/scripts/migrations/027-change-ticket-write-permissions.py
@@ -49,5 +49,6 @@ def main():
 
         ThreadLocalODMSession.flush_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/028-remove-svn-trees.py b/scripts/migrations/028-remove-svn-trees.py
index 1cc12b1ac..13d368a26 100644
--- a/scripts/migrations/028-remove-svn-trees.py
+++ b/scripts/migrations/028-remove-svn-trees.py
@@ -51,5 +51,6 @@ def main():
                 ThreadLocalODMSession.flush_all()
                 ThreadLocalODMSession.close_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/029-set-mailbox-queue_empty.py b/scripts/migrations/029-set-mailbox-queue_empty.py
index c2075b71c..3a50b3c04 100644
--- a/scripts/migrations/029-set-mailbox-queue_empty.py
+++ b/scripts/migrations/029-set-mailbox-queue_empty.py
@@ -31,5 +31,6 @@ def main():
                            {'$set': {'queue_empty': False}},
                            multi=True)
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/031-set-user-pending-to-false.py b/scripts/migrations/031-set-user-pending-to-false.py
index edb755a2c..e1482b63c 100644
--- a/scripts/migrations/031-set-user-pending-to-false.py
+++ b/scripts/migrations/031-set-user-pending-to-false.py
@@ -35,5 +35,6 @@ def main():
             state(user).status = state(user).dirty
             ThreadLocalODMSession.flush_all()
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py b/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py
index 7e3dc1c3e..dc2ee9971 100644
--- a/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py
+++ b/scripts/migrations/034-update_subscriptions_ticket_and_mr_titles.py
@@ -47,7 +47,7 @@ def main():
             continue
         new_title = 'Ticket #%d: %s' % (ticket.ticket_num, ticket.summary)
         log.info('"%s" --> "%s"', sub.artifact_title, new_title)
-        if(task != 'diff'):
+        if (task != 'diff'):
             sub.artifact_title = new_title
         session(sub).flush(sub)
 
diff --git a/scripts/perf/load-up-forum.py b/scripts/perf/load-up-forum.py
index 91338dec1..1b63a632d 100644
--- a/scripts/perf/load-up-forum.py
+++ b/scripts/perf/load-up-forum.py
@@ -61,7 +61,7 @@ def main():
             p = thd.post(subject, 'a new topic 2')
 
             for j in range(randint(1, 5)):
-                new_post = {'text':'comment text'}
+                new_post = {'text': 'comment text'}
                 # post = thd.add_post(**new_post)
                 post = thd.add_post(text='comment text for real', subject="test subject")
 
diff --git a/scripts/perf/sstress.py b/scripts/perf/sstress.py
index a24f3d009..9cd0dc934 100644
--- a/scripts/perf/sstress.py
+++ b/scripts/perf/sstress.py
@@ -52,5 +52,6 @@ def stress():
     for x in range(N / C):
         server.sendmail('sstress@localhost', TOADDR, EMAIL_TEXT)
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/perf/test_git_lcd.py b/scripts/perf/test_git_lcd.py
index 4dadee6c1..d27576343 100644
--- a/scripts/perf/test_git_lcd.py
+++ b/scripts/perf/test_git_lcd.py
@@ -48,5 +48,6 @@ def main(repo_dir, sub_dir='', commit=None):
     pprint(result)
     print("Took %f seconds" % timer['result'])
 
+
 if __name__ == '__main__':
     main(*sys.argv[1:])