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

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

commit 13d5c856dab4e17205892d1433d1926e06f37d16
Author: Dave Brondsema <[email protected]>
AuthorDate: Thu Nov 6 15:59:46 2025 -0500

    rely on defopt package
---
 Allura/allura/scripts/scripttask.py | 74 ++++++++++++++++++-------------------
 requirements.in                     |  1 +
 requirements.txt                    | 10 +++++
 3 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/Allura/allura/scripts/scripttask.py 
b/Allura/allura/scripts/scripttask.py
index 0c9d339ac..61e7f02b0 100644
--- a/Allura/allura/scripts/scripttask.py
+++ b/Allura/allura/scripts/scripttask.py
@@ -63,6 +63,8 @@ def execute(cls, *, limit: int = 10, dry_run: bool = False):
 import io
 import logging
 
+import defopt
+
 from allura.lib.decorators import task
 from allura.lib.helpers import shlex_split
 
@@ -113,48 +115,42 @@ def main(cls):
         cls.execute(options)
 
 
-try:
-    import defopt
-except ModuleNotFoundError:
-    pass
-else:
-
-    class MetaDefOpt(type):
-        def __new__(meta, classname, bases, classDict):
-            return task(type.__new__(meta, classname, bases, classDict))
+class MetaDefOpt(type):
+    def __new__(meta, classname, bases, classDict):
+        return task(type.__new__(meta, classname, bases, classDict))
 
-        @property
-        def __doc__(cls):
-            with contextlib.redirect_stdout(io.StringIO()) as stderr:
-                try:
-                    cls.main(argv=['--help'])
-                except SystemExit:
-                    pass
-            return stderr.getvalue()
+    @property
+    def __doc__(cls):
+        with contextlib.redirect_stdout(io.StringIO()) as stderr:
+            try:
+                cls.main(argv=['--help'])
+            except SystemExit:
+                pass
+        return stderr.getvalue()
 
-    class DefOptScriptTask(metaclass=MetaDefOpt):
-        """Base class for a command-line script that is also executable as a 
task."""
+class DefOptScriptTask(metaclass=MetaDefOpt):
+    """Base class for a command-line script that is also executable as a 
task."""
 
-        def __new__(cls, arg_string=''):
-            # when taskd calls SomeTaskClass(), then this runs.  Not really 
the normal way to use __new__
-            # and can't use __init__ since we want to return a value
-            return cls._execute_task(arg_string)
+    def __new__(cls, arg_string=''):
+        # when taskd calls SomeTaskClass(), then this runs.  Not really the 
normal way to use __new__
+        # and can't use __init__ since we want to return a value
+        return cls._execute_task(arg_string)
 
-        @classmethod
-        def _execute_task(cls, arg_string):
-            try:
-                return cls.main(argv=shlex_split(arg_string or ''))
-            except SystemExit:
-                raise Exception("Error parsing args: '%s'" % arg_string)
+    @classmethod
+    def _execute_task(cls, arg_string):
+        try:
+            return cls.main(argv=shlex_split(arg_string or ''))
+        except SystemExit:
+            raise Exception("Error parsing args: '%s'" % arg_string)
 
-        @classmethod
-        def main(cls, **extra_kwargs):
-            defopt_params = dict(
-                no_negated_flags=True,
-            ) | extra_kwargs
-            return defopt.run(cls.execute, **defopt_params)
+    @classmethod
+    def main(cls, **extra_kwargs):
+        defopt_params = dict(
+            no_negated_flags=True,
+        ) | extra_kwargs
+        return defopt.run(cls.execute, **defopt_params)
 
-        @classmethod
-        def execute(cls, *args, **kwargs):
-            """User code goes here, using defopt kwargs with type 
annotations"""
-            raise NotImplementedError
+    @classmethod
+    def execute(cls, *args, **kwargs):
+        """User code goes here, using defopt kwargs with type annotations"""
+        raise NotImplementedError
diff --git a/requirements.in b/requirements.in
index 0b48ae4be..44b5786c0 100644
--- a/requirements.in
+++ b/requirements.in
@@ -6,6 +6,7 @@ beaker-session-jwt
 colander
 cryptography
 decorator
+defopt
 EasyWidgets
 emoji
 faust-cchardet
diff --git a/requirements.txt b/requirements.txt
index 575a767d1..d38a4869e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -47,6 +47,7 @@ colander==1.8.3
     # via -r requirements.in
 colorama==0.4.6 ; sys_platform == 'win32'
     # via
+    #   defopt
     #   pytest
     #   qrcode
 crank==0.8.1
@@ -60,6 +61,8 @@ cryptography==46.0.2
     #   pymongocrypt
 decorator==5.2.1
     # via -r requirements.in
+defopt==7.0.0
+    # via -r requirements.in
 diff-match-patch==20230430
     # via sxsdiff
 distlib==0.4.0
@@ -69,6 +72,7 @@ dnspython==2.8.0
 docutils==0.22.2
     # via
     #   -r requirements.in
+    #   defopt
     #   pypeline
 easywidgets==0.4.3
     # via -r requirements.in
@@ -190,6 +194,8 @@ platformdirs==4.5.0
     # via virtualenv
 pluggy==1.6.0
     # via pytest
+pockets==0.9.1
+    # via sphinxcontrib-napoleon
 pre-commit==4.3.0
     # via -r requirements.in
 profanityfilter==2.1.0
@@ -273,7 +279,9 @@ six==1.17.0
     #   creoleparser
     #   genshi
     #   html5lib
+    #   pockets
     #   python-dateutil
+    #   sphinxcontrib-napoleon
     #   sxsdiff
     #   webhelpers2
 smmap==5.0.2
@@ -284,6 +292,8 @@ sniffio==1.3.1
     #   httpx
 soupsieve==2.8
     # via beautifulsoup4
+sphinxcontrib-napoleon==0.7
+    # via defopt
 sxsdiff==0.3.0
     # via -r requirements.in
 termcolor==3.1.0

Reply via email to