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

gcruz pushed a commit to branch gc/8580
in repository https://gitbox.apache.org/repos/asf/allura.git

commit 6a006322c0dcfe121d8fecbe3a5583ce3ba09bf2
Author: Guillermo Cruz <guillermo.c...@slashdotmedia.com>
AuthorDate: Wed May 21 14:24:38 2025 +0000

    [#8580] moved settings from setup.py into a new pyproject.toml
---
 Allura/pyproject.toml                              | 169 +++++++++++++++++++++
 Allura/setup.py                                    | 136 +----------------
 .../setup.py => AlluraTest/pyproject.toml          |  43 +++---
 AlluraTest/setup.py                                |  19 +--
 ForgeActivity/pyproject.toml                       |  55 +++++++
 ForgeActivity/setup.py                             |  30 +---
 ForgeFeedback/setup.py => ForgeBlog/pyproject.toml |  57 +++----
 ForgeBlog/setup.py                                 |  32 +---
 ForgeFeedback/setup.py => ForgeChat/pyproject.toml |  57 +++----
 ForgeChat/setup.py                                 |  30 +---
 ForgeDiscussion/pyproject.toml                     |  52 +++++++
 ForgeDiscussion/setup.py                           |  30 +---
 ForgeFeedback/{setup.py => pyproject.toml}         |  56 +++----
 ForgeFeedback/setup.py                             |  29 +---
 .../setup.py => ForgeFiles/pyproject.toml          |  46 +++---
 ForgeFiles/setup.py                                |  11 +-
 ForgeFeedback/setup.py => ForgeGit/pyproject.toml  |  58 +++----
 ForgeGit/setup.py                                  |  31 +---
 ForgeImporters/pyproject.toml                      |  61 ++++++++
 ForgeImporters/setup.py                            |  31 +---
 ForgeShortUrl/setup.py => ForgeLink/pyproject.toml |  48 +++---
 ForgeLink/setup.py                                 |  27 +---
 ForgeSVN/pyproject.toml                            |  54 +++++++
 ForgeSVN/setup.py                                  |  40 +----
 ForgeShortUrl/{setup.py => pyproject.toml}         |  48 +++---
 ForgeShortUrl/setup.py                             |  18 +--
 ForgeTracker/pyproject.toml                        |  58 +++++++
 ForgeTracker/setup.py                              |  36 +----
 .../setup.py => ForgeUserStats/pyproject.toml      |  57 +++----
 ForgeUserStats/setup.py                            |  31 +---
 ForgeShortUrl/setup.py => ForgeWiki/pyproject.toml |  48 +++---
 ForgeWiki/setup.py                                 |  27 +---
 32 files changed, 776 insertions(+), 749 deletions(-)

diff --git a/Allura/pyproject.toml b/Allura/pyproject.toml
new file mode 100644
index 000000000..84d9f2241
--- /dev/null
+++ b/Allura/pyproject.toml
@@ -0,0 +1,169 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "Allura"
+dynamic = ["version"]
+description = "Base distribution of the Allura development platform"
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge", "turbogears", "jinja2", "mongodb"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = []
+
+[tool.setuptools.packages.find]
+exclude = ["ez_setup"]
+
+[tool.setuptools.package-data]
+"allura" = [
+    "templates/**.html",
+    "templates/**.py",
+    "templates/**.xml",
+    "templates/**.txt",
+    "public/*/*/*/*/*"
+]
+
+# from https://github.com/python-babel/babel/issues/777
+[[tool.babel.mappings]]
+method = "jinja2"
+pattern = "templates/**.html"
+encoding = "utf-8"
+
+[[tool.babel.mappings]]
+method = "python"
+pattern = "**.py"
+encoding = "utf-8"
+
+[[tool.babel.mappings]]
+method = "ignore"
+pattern = "public/**"
+encoding = "utf-8"
+
+# maybe?
+#[tool.babel.extract_messages]
+#message_extractors = """{
+#"allura": [
+#    "**.py" = "python",
+#    "templates/**.html" = "jinja2",
+#    "public/**" =  "ignore",
+#    ]
+#}"""
+
+
+[project.entry-points."paste.app_factory"]
+main = "allura.config.middleware:make_app"
+
+[project.entry-points."paste.app_install"]
+main = "paste.script.appinstall:Installer"
+
+[project.entry-points.allura]
+profile = "allura.ext.user_profile:UserProfileApp"
+admin = "allura.ext.admin:AdminApp"
+search = "allura.ext.search:SearchApp"
+home = "allura.ext.project_home:ProjectHomeApp"
+
+[project.entry-points."allura.auth"]
+local = "allura.lib.plugin:LocalAuthenticationProvider"
+ldap = "allura.lib.plugin:LdapAuthenticationProvider"
+
+[project.entry-points."allura.user_prefs"]
+local = "allura.lib.plugin:LocalUserPreferencesProvider"
+ldap = "allura.lib.plugin:LdapUserPreferencesProvider"
+
+[project.entry-points."allura.project_registration"]
+local = "allura.lib.plugin:LocalProjectRegistrationProvider"
+
+[project.entry-points."allura.theme"]
+allura = "allura.lib.plugin:ThemeProvider"
+responsive = "allura.lib.plugin:ResponsiveTheme"
+
+[project.entry-points."allura.theme.override"]
+responsive = 
"allura.templates_responsive.responsive_overrides:ResponsiveOverrides"
+
+[project.entry-points."allura.spam"]
+akismet = "allura.lib.spam.akismetfilter:AkismetSpamFilter"
+stopforumspam = "allura.lib.spam.stopforumspamfilter:StopForumSpamSpamFilter"
+
+[project.entry-points."allura.phone"]
+nexmo = "allura.lib.phone.nexmo:NexmoPhoneService"
+
+[project.entry-points."allura.site_admin"]
+stats = "allura.controllers.site_admin:StatsSiteAdminExtension"
+troves = "allura.controllers.trovecategories:TroveCategorySiteAdminExtension"
+
+[project.entry-points."allura.user_profile.sections"]
+personal-data = "allura.ext.user_profile.user_main:PersonalDataSection"
+projects = "allura.ext.user_profile.user_main:ProjectsSection"
+skills = "allura.ext.user_profile.user_main:SkillsSection"
+tools = "allura.ext.user_profile.user_main:ToolsSection"
+social = "allura.ext.user_profile.user_main:SocialSection"
+
+[project.entry-points."allura.personal_dashboard.sections"]
+projects = "allura.ext.personal_dashboard.dashboard_main:ProjectsSection"
+tickets = "allura.ext.personal_dashboard.dashboard_main:TicketsSection"
+merge_requests = 
"allura.ext.personal_dashboard.dashboard_main:MergeRequestsSection"
+activity = "allura.ext.personal_dashboard.dashboard_main:ActivitySection"
+
+[project.entry-points."allura.webhooks"]
+repo-push = "allura.webhooks:RepoPushWebhookSender"
+
+[project.entry-points."allura.multifactor.totp"]
+mongodb = "allura.lib.multifactor:MongodbTotpService"
+filesystem-googleauth = 
"allura.lib.multifactor:GoogleAuthenticatorPamFilesystemTotpService"
+
+[project.entry-points."allura.multifactor.recovery_code"]
+mongodb = "allura.lib.multifactor:MongodbRecoveryCodeService"
+filesystem-googleauth = 
"allura.lib.multifactor:GoogleAuthenticatorPamFilesystemRecoveryCodeService"
+
+[project.entry-points."paste.paster_command"]
+taskd = "allura.command.taskd:TaskdCommand"
+taskd_cleanup = "allura.command.taskd_cleanup:TaskdCleanupCommand"
+task = "allura.command.taskd:TaskCommand"
+models = "allura.command:ShowModelsCommand"
+reindex = "allura.command:ReindexCommand"
+ensure_index = "allura.command:EnsureIndexCommand"
+script = "allura.command:ScriptCommand"
+set-tool-access = "allura.command:SetToolAccessCommand"
+smtp_server = "allura.command:SMTPServerCommand"
+create-neighborhood = "allura.command:CreateNeighborhoodCommand"
+update-neighborhood-home-tool = "allura.command:UpdateNeighborhoodCommand"
+create-trove-categories = "allura.command:CreateTroveCategoriesCommand"
+set-neighborhood-features = "allura.command:SetNeighborhoodFeaturesCommand"
+reclone-repo = "allura.command.reclone_repo:RecloneRepoCommand"
+
+[project.entry-points."easy_widgets.resources"]
+ew_resources = "allura.config.resources:register_ew_resources"
+
+[project.entry-points."easy_widgets.engines"]
+jinja = "allura.config.app_cfg:JinjaEngine"
+
+[project.entry-points.activitystream]
+storage = "activitystream.storage.mingstorage:MingStorage"
+director = "allura.model.timeline:Director"
+aggregator = "allura.model.timeline:Aggregator"
diff --git a/Allura/setup.py b/Allura/setup.py
index e32efdeb0..c994f8e0f 100644
--- a/Allura/setup.py
+++ b/Allura/setup.py
@@ -15,8 +15,8 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
-
+from setuptools import setup
+__version__ = "undefined"
 exec(open('allura/version.py').read())  # noqa: S102
 
 PROJECT_DESCRIPTION = '''
@@ -26,135 +26,5 @@
 '''
 setup(
     name='Allura',
-    version=__version__,  # noqa: F821
-    description='Base distribution of the Allura development platform',
-    long_description=PROJECT_DESCRIPTION,
-    author='Allura Team',
-    url='https://allura.apache.org/',
-    keywords='allura forge turbogears jinja2 mongodb',
-    license='Apache License, http://www.apache.org/licenses/LICENSE-2.0',
-    platforms=[
-        'Linux',
-        'MacOS X',
-    ],
-    classifiers=[
-        'Development Status :: 4 - Beta',
-        'Environment :: Web Environment',
-        'Framework :: TurboGears',
-        'Intended Audience :: Developers',
-        'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
-        'License :: OSI Approved :: Apache Software License',
-    ],
-    install_requires=[
-    ],
-    paster_plugins=['PasteScript', 'TurboGears2', 'Ming'],
-    packages=find_packages(exclude=['ez_setup']),
-    include_package_data=True,
-    package_data={'allura': ['templates/**.html',
-                             'templates/**.py',
-                             'templates/**.xml',
-                             'templates/**.txt',
-                             'public/*/*/*/*/*',
-                             ]},
-    message_extractors={'allura': [
-        ('**.py', 'python', None),
-        ('templates/**.html', 'jinja2', None),
-        ('public/**', 'ignore', None)]},
-
-    # These entry points define what tools and plugins are available for 
Allura.
-    # Other packages (the Forge* directories) or 3rd-party can add more too.
-    # development.ini is used for many cases to specify which to actually use.
-    entry_points="""
-    [paste.app_factory]
-    main = allura.config.middleware:make_app
-    [paste.app_install]
-    # used from SetupCommand, this will call our setup_app()
-    main = paste.script.appinstall:Installer
-
-    [allura]
-    profile = allura.ext.user_profile:UserProfileApp
-    admin = allura.ext.admin:AdminApp
-    search = allura.ext.search:SearchApp
-    home = allura.ext.project_home:ProjectHomeApp
-
-    [allura.auth]
-    local = allura.lib.plugin:LocalAuthenticationProvider
-    ldap = allura.lib.plugin:LdapAuthenticationProvider
-
-    [allura.user_prefs]
-    local = allura.lib.plugin:LocalUserPreferencesProvider
-    ldap = allura.lib.plugin:LdapUserPreferencesProvider
-
-    [allura.project_registration]
-    local = allura.lib.plugin:LocalProjectRegistrationProvider
-
-    [allura.theme]
-    allura = allura.lib.plugin:ThemeProvider
-    responsive = allura.lib.plugin:ResponsiveTheme
-
-    [allura.theme.override]
-    responsive = 
allura.templates_responsive.responsive_overrides:ResponsiveOverrides
-
-    [allura.spam]
-    akismet = allura.lib.spam.akismetfilter:AkismetSpamFilter
-    stopforumspam = allura.lib.spam.stopforumspamfilter:StopForumSpamSpamFilter
-
-    [allura.phone]
-    nexmo = allura.lib.phone.nexmo:NexmoPhoneService
-
-    [allura.site_admin]
-    stats = allura.controllers.site_admin:StatsSiteAdminExtension
-    troves = allura.controllers.trovecategories:TroveCategorySiteAdminExtension
-
-    [allura.user_profile.sections]
-    personal-data = allura.ext.user_profile.user_main:PersonalDataSection
-    projects = allura.ext.user_profile.user_main:ProjectsSection
-    skills = allura.ext.user_profile.user_main:SkillsSection
-    tools = allura.ext.user_profile.user_main:ToolsSection
-    social = allura.ext.user_profile.user_main:SocialSection
-
-    [allura.personal_dashboard.sections]
-    projects = allura.ext.personal_dashboard.dashboard_main:ProjectsSection
-    tickets = allura.ext.personal_dashboard.dashboard_main:TicketsSection
-    merge_requests = 
allura.ext.personal_dashboard.dashboard_main:MergeRequestsSection
-    activity = allura.ext.personal_dashboard.dashboard_main:ActivitySection
-
-    [allura.webhooks]
-    repo-push = allura.webhooks:RepoPushWebhookSender
-
-    [allura.multifactor.totp]
-    mongodb = allura.lib.multifactor:MongodbTotpService
-    filesystem-googleauth = 
allura.lib.multifactor:GoogleAuthenticatorPamFilesystemTotpService
-
-    [allura.multifactor.recovery_code]
-    mongodb = allura.lib.multifactor:MongodbRecoveryCodeService
-    filesystem-googleauth = 
allura.lib.multifactor:GoogleAuthenticatorPamFilesystemRecoveryCodeService
-
-    [paste.paster_command]
-    taskd = allura.command.taskd:TaskdCommand
-    taskd_cleanup = allura.command.taskd_cleanup:TaskdCleanupCommand
-    task = allura.command.taskd:TaskCommand
-    models = allura.command:ShowModelsCommand
-    reindex = allura.command:ReindexCommand
-    ensure_index = allura.command:EnsureIndexCommand
-    script = allura.command:ScriptCommand
-    set-tool-access = allura.command:SetToolAccessCommand
-    smtp_server=allura.command:SMTPServerCommand
-    create-neighborhood = allura.command:CreateNeighborhoodCommand
-    update-neighborhood-home-tool = allura.command:UpdateNeighborhoodCommand
-    create-trove-categories = allura.command:CreateTroveCategoriesCommand
-    set-neighborhood-features = allura.command:SetNeighborhoodFeaturesCommand
-    reclone-repo = allura.command.reclone_repo:RecloneRepoCommand
-
-    [easy_widgets.resources]
-    ew_resources=allura.config.resources:register_ew_resources
-
-    [easy_widgets.engines]
-    jinja = allura.config.app_cfg:JinjaEngine
-
-    [activitystream]
-    storage = activitystream.storage.mingstorage:MingStorage
-    director = allura.model.timeline:Director
-    aggregator = allura.model.timeline:Aggregator
-    """,
+    version=__version__,
 )
diff --git a/ForgeShortUrl/setup.py b/AlluraTest/pyproject.toml
similarity index 58%
copy from ForgeShortUrl/setup.py
copy to AlluraTest/pyproject.toml
index 7450912c7..d4190ced6 100644
--- a/ForgeShortUrl/setup.py
+++ b/AlluraTest/pyproject.toml
@@ -15,25 +15,30 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
+[project]
+name = "AlluraTest"
+version = "0.1"
+description = "Allura testing support"
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = []
 
-setup(name='ForgeShortUrl',
-      description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      ShortURL=forgeshorturl.main:ForgeShortUrlApp
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-      """,)
+
+[tool.setuptools.package-data]
+"*" = ["*"]
\ No newline at end of file
diff --git a/AlluraTest/setup.py b/AlluraTest/setup.py
index 056c61d43..fa27d0774 100644
--- a/AlluraTest/setup.py
+++ b/AlluraTest/setup.py
@@ -15,23 +15,8 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+from setuptools import setup
 
 setup(name='AlluraTest',
       version='0.1',
-      description="Allura testing support",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-      ]
-      )
+)
diff --git a/ForgeActivity/pyproject.toml b/ForgeActivity/pyproject.toml
new file mode 100644
index 000000000..e5763cd74
--- /dev/null
+++ b/ForgeActivity/pyproject.toml
@@ -0,0 +1,55 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "ForgeActivity"
+version = "0.1"
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
+
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
+
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+activity = "forgeactivity.main:ForgeActivityApp"
+
+[project.entry-points."allura.user_profile.sections"]
+activity = "forgeactivity.main:ForgeActivityProfileSection"
+
+[project.entry-points."easy_widgets.resources"]
+ew_resources = "forgeactivity.config.resources:register_ew_resources"
\ No newline at end of file
diff --git a/ForgeActivity/setup.py b/ForgeActivity/setup.py
index 9795dfb4b..27833315a 100644
--- a/ForgeActivity/setup.py
+++ b/ForgeActivity/setup.py
@@ -19,32 +19,4 @@
 
 setup(name='ForgeActivity',
       version="0.1",
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      activity=forgeactivity.main:ForgeActivityApp
-
-      [allura.user_profile.sections]
-      activity=forgeactivity.main:ForgeActivityProfileSection
-
-      [easy_widgets.resources]
-      ew_resources=forgeactivity.config.resources:register_ew_resources
-      """,
-      )
+)
diff --git a/ForgeFeedback/setup.py b/ForgeBlog/pyproject.toml
similarity index 50%
copy from ForgeFeedback/setup.py
copy to ForgeBlog/pyproject.toml
index 196098a9a..cb66a040c 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeBlog/pyproject.toml
@@ -15,35 +15,38 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
-from setuptools import setup, find_packages
+[project]
+name = "ForgeBlog"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-from forgefeedback.version import __version__
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-setup(name='ForgeFeedback',
-      version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Feedback=forgefeedback.feedback_main:ForgeFeedbackApp
+[tool.setuptools.package-data]
+"*" = ["*"]
 
+[project.entry-points.allura]
+blog = "forgeblog.main:ForgeBlogApp"
 
-      """,
-      )
+[project.entry-points."paste.paster_command"]
+pull-rss-feeds = "forgeblog.command.rssfeeds:RssFeedsCommand"
\ No newline at end of file
diff --git a/ForgeBlog/setup.py b/ForgeBlog/setup.py
index 7eda91795..18a212bf0 100644
--- a/ForgeBlog/setup.py
+++ b/ForgeBlog/setup.py
@@ -15,35 +15,11 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+from setuptools import setup
 
-from forgeblog.version import __version__
+__version__ = "undefined"
+exec(open('forgeblog/version.py').read())  # noqa: S102
 
 setup(name='ForgeBlog',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      blog=forgeblog.main:ForgeBlogApp
-
-      [paste.paster_command]
-      pull-rss-feeds = forgeblog.command.rssfeeds:RssFeedsCommand
-      """,
-      )
+)
diff --git a/ForgeFeedback/setup.py b/ForgeChat/pyproject.toml
similarity index 50%
copy from ForgeFeedback/setup.py
copy to ForgeChat/pyproject.toml
index 196098a9a..55f5f5c8d 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeChat/pyproject.toml
@@ -15,35 +15,38 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
-from setuptools import setup, find_packages
+[project]
+name = "ForgeChat"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-from forgefeedback.version import __version__
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-setup(name='ForgeFeedback',
-      version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Feedback=forgefeedback.feedback_main:ForgeFeedbackApp
+[tool.setuptools.package-data]
+"*" = ["*"]
 
+[project.entry-points.allura]
+Chat = "forgechat.main:ForgeChatApp"
 
-      """,
-      )
+[project.entry-points."paste.global_paster_command"]
+ircbot = "forgechat.command:IRCBotCommand"
\ No newline at end of file
diff --git a/ForgeChat/setup.py b/ForgeChat/setup.py
index 242841bc2..119825199 100644
--- a/ForgeChat/setup.py
+++ b/ForgeChat/setup.py
@@ -17,33 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgechat.version import __version__
+__version__ = "undefined"
+exec(open('forgechat/version.py').read())  # noqa: S102
 
 setup(name='ForgeChat',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Chat=forgechat.main:ForgeChatApp
-
-      [paste.global_paster_command]
-      ircbot=forgechat.command:IRCBotCommand
-      """,
-      )
+)
diff --git a/ForgeDiscussion/pyproject.toml b/ForgeDiscussion/pyproject.toml
new file mode 100644
index 000000000..18f5c3d5c
--- /dev/null
+++ b/ForgeDiscussion/pyproject.toml
@@ -0,0 +1,52 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "ForgeDiscussion"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
+
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
+
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+Discussion = "forgediscussion.forum_main:ForgeDiscussionApp"
+
+[project.entry-points."allura.site_stats"]
+posts_24hr = "forgediscussion.site_stats:posts_24hr"
\ No newline at end of file
diff --git a/ForgeDiscussion/setup.py b/ForgeDiscussion/setup.py
index a8993785d..6a6284b6c 100644
--- a/ForgeDiscussion/setup.py
+++ b/ForgeDiscussion/setup.py
@@ -17,33 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgediscussion.version import __version__
+__version__ = "undefined"
+exec(open('forgediscussion/version.py').read())  # noqa: S102
 
 setup(name='ForgeDiscussion',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Discussion=forgediscussion.forum_main:ForgeDiscussionApp
-
-      [allura.site_stats]
-      posts_24hr=forgediscussion.site_stats:posts_24hr
-      """,
-      )
+)
diff --git a/ForgeFeedback/setup.py b/ForgeFeedback/pyproject.toml
similarity index 52%
copy from ForgeFeedback/setup.py
copy to ForgeFeedback/pyproject.toml
index 196098a9a..387490eae 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeFeedback/pyproject.toml
@@ -15,35 +15,35 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
-from setuptools import setup, find_packages
+[project]
+name = "ForgeFeedback"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge", "turbogears"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-from forgefeedback.version import __version__
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-setup(name='ForgeFeedback',
-      version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Feedback=forgefeedback.feedback_main:ForgeFeedbackApp
+[tool.setuptools.package-data]
+"*" = ["*"]
 
-
-      """,
-      )
+[project.entry-points.allura]
+Feedback = "forgefeedback.feedback_main:ForgeFeedbackApp"
\ No newline at end of file
diff --git a/ForgeFeedback/setup.py b/ForgeFeedback/setup.py
index 196098a9a..493da4917 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeFeedback/setup.py
@@ -18,32 +18,9 @@
 
 from setuptools import setup, find_packages
 
-from forgefeedback.version import __version__
+__version__ = "undefined"
+exec(open('forgefeedback/version.py').read())  # noqa: S102
 
 setup(name='ForgeFeedback',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Feedback=forgefeedback.feedback_main:ForgeFeedbackApp
-
-
-      """,
-      )
+)
diff --git a/ForgeShortUrl/setup.py b/ForgeFiles/pyproject.toml
similarity index 54%
copy from ForgeShortUrl/setup.py
copy to ForgeFiles/pyproject.toml
index 7450912c7..b79178de2 100644
--- a/ForgeShortUrl/setup.py
+++ b/ForgeFiles/pyproject.toml
@@ -15,25 +15,33 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
+[project]
+name = "ForgeFiles"
+version = "0.1.0"
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = []
 
-setup(name='ForgeShortUrl',
-      description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      ShortURL=forgeshorturl.main:ForgeShortUrlApp
+[tool.setuptools.packages.find]
+include = ["forgefiles"]
 
-      """,)
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+Files = "forgefiles.files_main:FilesApp"
\ No newline at end of file
diff --git a/ForgeFiles/setup.py b/ForgeFiles/setup.py
index a3dbaa957..0cfcadedc 100755
--- a/ForgeFiles/setup.py
+++ b/ForgeFiles/setup.py
@@ -20,13 +20,4 @@
 
 setup(name='ForgeFiles',
       version='0.1.0',
-      description="",
-      packages=['forgefiles'],
-      include_package_data=True,
-      zip_safe=True,
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Files=forgefiles.files_main:FilesApp
-      """,
-      )
+)
diff --git a/ForgeFeedback/setup.py b/ForgeGit/pyproject.toml
similarity index 50%
copy from ForgeFeedback/setup.py
copy to ForgeGit/pyproject.toml
index 196098a9a..5c5ac2798 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeGit/pyproject.toml
@@ -15,35 +15,39 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
-from setuptools import setup, find_packages
+[project]
+name = "ForgeGit"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-from forgefeedback.version import __version__
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-setup(name='ForgeFeedback',
-      version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Feedback=forgefeedback.feedback_main:ForgeFeedbackApp
+[tool.setuptools.package-data]
+"*" = ["*"]
 
+[project.entry-points.allura]
+Git = "forgegit.git_main:ForgeGitApp"
 
-      """,
-      )
+[project.entry-points."allura.timers"]
+git = "forgegit.git_main:git_timers"
+forgegit = "forgegit.git_main:forgegit_timers"
\ No newline at end of file
diff --git a/ForgeGit/setup.py b/ForgeGit/setup.py
index e91068b90..70f41bc73 100644
--- a/ForgeGit/setup.py
+++ b/ForgeGit/setup.py
@@ -17,34 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgegit.version import __version__
+__version__ = "undefined"
+exec(open('forgegit/version.py').read())  # noqa: S102
 
 setup(name='ForgeGit',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Git=forgegit.git_main:ForgeGitApp
-
-      [allura.timers]
-      git = forgegit.git_main:git_timers
-      forgegit = forgegit.git_main:forgegit_timers
-      """,
-      )
+)
diff --git a/ForgeImporters/pyproject.toml b/ForgeImporters/pyproject.toml
new file mode 100644
index 000000000..c939cee79
--- /dev/null
+++ b/ForgeImporters/pyproject.toml
@@ -0,0 +1,61 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "ForgeImporters"
+description = ""
+version="0.0"
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
+
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
+
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points."allura.project_importers"]
+trac = "forgeimporters.trac.project:TracProjectImporter"
+github = "forgeimporters.github.project:GitHubProjectImporter"
+
+[project.entry-points."allura.importers"]
+github-tracker = "forgeimporters.github.tracker:GitHubTrackerImporter"
+github-wiki = "forgeimporters.github.wiki:GitHubWikiImporter"
+github-repo = "forgeimporters.github.code:GitHubRepoImporter"
+trac-tickets = "forgeimporters.trac.tickets:TracTicketImporter"
+forge-tracker = "forgeimporters.forge.tracker:ForgeTrackerImporter"
+forge-discussion = "forgeimporters.forge.discussion:ForgeDiscussionImporter"
+
+[project.entry-points."allura.admin"]
+importers = "forgeimporters.base:ImportAdminExtension"
\ No newline at end of file
diff --git a/ForgeImporters/setup.py b/ForgeImporters/setup.py
index c834fe545..b053a03eb 100644
--- a/ForgeImporters/setup.py
+++ b/ForgeImporters/setup.py
@@ -18,33 +18,4 @@
 from setuptools import setup, find_packages
 
 
-setup(name='ForgeImporters',
-      description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura.project_importers]
-      trac = forgeimporters.trac.project:TracProjectImporter
-      github = forgeimporters.github.project:GitHubProjectImporter
-
-      [allura.importers]
-      github-tracker = forgeimporters.github.tracker:GitHubTrackerImporter
-      github-wiki = forgeimporters.github.wiki:GitHubWikiImporter
-      github-repo = forgeimporters.github.code:GitHubRepoImporter
-      trac-tickets = forgeimporters.trac.tickets:TracTicketImporter
-      forge-tracker = forgeimporters.forge.tracker:ForgeTrackerImporter
-      forge-discussion = 
forgeimporters.forge.discussion:ForgeDiscussionImporter
-
-      [allura.admin]
-      importers = forgeimporters.base:ImportAdminExtension
-      """,)
+setup(name='ForgeImporters')
diff --git a/ForgeShortUrl/setup.py b/ForgeLink/pyproject.toml
similarity index 53%
copy from ForgeShortUrl/setup.py
copy to ForgeLink/pyproject.toml
index 7450912c7..984837d2b 100644
--- a/ForgeShortUrl/setup.py
+++ b/ForgeLink/pyproject.toml
@@ -15,25 +15,35 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
+[project]
+name = "ForgeLink"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-setup(name='ForgeShortUrl',
-      description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      ShortURL=forgeshorturl.main:ForgeShortUrlApp
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-      """,)
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+Link = "forgelink.link_main:ForgeLinkApp"
\ No newline at end of file
diff --git a/ForgeLink/setup.py b/ForgeLink/setup.py
index fc917924f..99e53a9e6 100644
--- a/ForgeLink/setup.py
+++ b/ForgeLink/setup.py
@@ -17,30 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgelink.version import __version__
+__version__ = "undefined"
+exec(open('forgelink/version.py').read())  # noqa: S102
 
 setup(name='ForgeLink',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Link=forgelink.link_main:ForgeLinkApp
-      """,
-      )
+)
diff --git a/ForgeSVN/pyproject.toml b/ForgeSVN/pyproject.toml
new file mode 100644
index 000000000..4c8ede335
--- /dev/null
+++ b/ForgeSVN/pyproject.toml
@@ -0,0 +1,54 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "ForgeSVN"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura",
+    "pysvn",
+]
+
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
+
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+SVN = "forgesvn.svn_main:ForgeSVNApp"
+
+[project.entry-points."allura.timers"]
+svn = "forgesvn.svn_main:svn_timers"
+forgesvn = "forgesvn.svn_main:forgesvn_timers"
\ No newline at end of file
diff --git a/ForgeSVN/setup.py b/ForgeSVN/setup.py
index 7a6e0616b..4f94e9264 100644
--- a/ForgeSVN/setup.py
+++ b/ForgeSVN/setup.py
@@ -17,43 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgesvn.version import __version__
-
-# "install_requires" can't be safely used with pysvn since pysvn is packaged
-# strangely and is not always known to packaging tools (setup.py, pip) even
-# when it is installed and can be imported and used
-try:
-    import pysvn
-except ImportError:
-    print('\npysvn must be installed for ForgeSVN to work\n')
-    raise
+__version__ = "undefined"
+exec(open('forgesvn/version.py').read())  # noqa: S102
 
 setup(name='ForgeSVN',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura'
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      SVN=forgesvn.svn_main:ForgeSVNApp
-
-      [allura.timers]
-      svn = forgesvn.svn_main:svn_timers
-      forgesvn = forgesvn.svn_main:forgesvn_timers
-      """,
-      )
+)
diff --git a/ForgeShortUrl/setup.py b/ForgeShortUrl/pyproject.toml
similarity index 53%
copy from ForgeShortUrl/setup.py
copy to ForgeShortUrl/pyproject.toml
index 7450912c7..9e1f4837a 100644
--- a/ForgeShortUrl/setup.py
+++ b/ForgeShortUrl/pyproject.toml
@@ -15,25 +15,35 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
+[project]
+name = "ForgeShortUrl"
+version = "0.0"
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-setup(name='ForgeShortUrl',
-      description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      ShortURL=forgeshorturl.main:ForgeShortUrlApp
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-      """,)
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+ShortURL = "forgeshorturl.main:ForgeShortUrlApp"
\ No newline at end of file
diff --git a/ForgeShortUrl/setup.py b/ForgeShortUrl/setup.py
index 7450912c7..efddc6a1c 100644
--- a/ForgeShortUrl/setup.py
+++ b/ForgeShortUrl/setup.py
@@ -20,20 +20,4 @@
 
 setup(name='ForgeShortUrl',
       description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      ShortURL=forgeshorturl.main:ForgeShortUrlApp
-
-      """,)
+)
diff --git a/ForgeTracker/pyproject.toml b/ForgeTracker/pyproject.toml
new file mode 100644
index 000000000..7faa5194f
--- /dev/null
+++ b/ForgeTracker/pyproject.toml
@@ -0,0 +1,58 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "ForgeTracker"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
+
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
+
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+Tickets = "forgetracker.tracker_main:ForgeTrackerApp"
+
+[project.entry-points."allura.site_stats"]
+tickets_24hr = "forgetracker.site_stats:tickets_stats_24hr"
+
+[project.entry-points."easy_widgets.resources"]
+ew_resources = "forgetracker.config.resources:register_ew_resources"
+
+[project.entry-points."paste.paster_command"]
+fix-discussion = "forgetracker.command.fix_discussion:FixDiscussion"
\ No newline at end of file
diff --git a/ForgeTracker/setup.py b/ForgeTracker/setup.py
index d3e00ccd3..b9218e87a 100644
--- a/ForgeTracker/setup.py
+++ b/ForgeTracker/setup.py
@@ -17,39 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgetracker.version import __version__
+__version__ = "undefined"
+exec(open('forgetracker/version.py').read())  # noqa: S102
 
 setup(name='ForgeTracker',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Tickets=forgetracker.tracker_main:ForgeTrackerApp
-
-      [allura.site_stats]
-      tickets_24hr=forgetracker.site_stats:tickets_stats_24hr
-
-      [easy_widgets.resources]
-      ew_resources=forgetracker.config.resources:register_ew_resources
-
-      [paste.paster_command]
-      fix-discussion = forgetracker.command.fix_discussion:FixDiscussion
-      """,
-      )
+)
diff --git a/ForgeFeedback/setup.py b/ForgeUserStats/pyproject.toml
similarity index 50%
copy from ForgeFeedback/setup.py
copy to ForgeUserStats/pyproject.toml
index 196098a9a..b6d1db9b2 100644
--- a/ForgeFeedback/setup.py
+++ b/ForgeUserStats/pyproject.toml
@@ -15,35 +15,38 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
-from setuptools import setup, find_packages
+[project]
+name = "ForgeUserStats"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "allura"
+]
 
-from forgefeedback.version import __version__
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-setup(name='ForgeFeedback',
-      version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Feedback=forgefeedback.feedback_main:ForgeFeedbackApp
+[tool.setuptools.package-data]
+"*" = ["*"]
 
+[project.entry-points.allura]
+userstats = "forgeuserstats.main:ForgeUserStatsApp"
 
-      """,
-      )
+[project.entry-points."allura.stats"]
+userstats = "forgeuserstats.main:UserStatsListener"
\ No newline at end of file
diff --git a/ForgeUserStats/setup.py b/ForgeUserStats/setup.py
index 1ad5c3ae0..7bf60d4a6 100644
--- a/ForgeUserStats/setup.py
+++ b/ForgeUserStats/setup.py
@@ -17,34 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgeuserstats.version import __version__
+__version__ = "undefined"
+exec(open('forgeuserstats/version.py').read())  # noqa: S102
 
 setup(name='ForgeUserStats',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      userstats=forgeuserstats.main:ForgeUserStatsApp
-
-      [allura.stats]
-      userstats=forgeuserstats.main:UserStatsListener
-
-      """,
-      )
+)
diff --git a/ForgeShortUrl/setup.py b/ForgeWiki/pyproject.toml
similarity index 53%
copy from ForgeShortUrl/setup.py
copy to ForgeWiki/pyproject.toml
index 7450912c7..b8d0d2cd2 100644
--- a/ForgeShortUrl/setup.py
+++ b/ForgeWiki/pyproject.toml
@@ -15,25 +15,35 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from setuptools import setup, find_packages
+[build-system]
+requires = ["setuptools", "wheel"]
+build-backend = "setuptools.build_meta"
 
+[project]
+name = "ForgeWiki"
+dynamic = ["version"]
+description = ""
+readme = ""
+authors = [
+    {name = "Allura Team"}
+]
+license = {text = "Apache License, http://www.apache.org/licenses/LICENSE-2.0"}
+keywords = ["allura", "forge"]
+classifiers = [
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+    "License :: OSI Approved :: Apache Software License"
+]
+dependencies = [
+    "Allura"
+]
 
-setup(name='ForgeShortUrl',
-      description="",
-      long_description="",
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=['Allura', ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      ShortURL=forgeshorturl.main:ForgeShortUrlApp
+[tool.setuptools.packages.find]
+exclude = ["ez_setup", "examples", "tests"]
 
-      """,)
+[tool.setuptools.package-data]
+"*" = ["*"]
+
+[project.entry-points.allura]
+Wiki = "forgewiki.wiki_main:ForgeWikiApp"
\ No newline at end of file
diff --git a/ForgeWiki/setup.py b/ForgeWiki/setup.py
index 76db94107..e19ee9d7a 100644
--- a/ForgeWiki/setup.py
+++ b/ForgeWiki/setup.py
@@ -17,30 +17,9 @@
 
 from setuptools import setup, find_packages
 
-from forgewiki.version import __version__
+__version__ = "undefined"
+exec(open('forgewiki/version.py').read())  # noqa: S102
 
 setup(name='ForgeWiki',
       version=__version__,
-      description="",
-      long_description="""\
-""",
-      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-      classifiers=[],
-      keywords='',
-      author='',
-      author_email='',
-      url='',
-      license='',
-      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-      include_package_data=True,
-      zip_safe=False,
-      install_requires=[
-          # -*- Extra requirements: -*-
-          'Allura',
-      ],
-      entry_points="""
-      # -*- Entry points: -*-
-      [allura]
-      Wiki=forgewiki.wiki_main:ForgeWikiApp
-      """,
-      )
+)

Reply via email to