Patch-Source: https://github.com/nose-devs/nose/pull/1117
From 5221885fd4fea96edff3e7692cef4531e166e15c Mon Sep 17 00:00:00 2001
From: Thomas A Caswell <tcaswell@gmail.com>
Date: Sat, 26 Sep 2015 23:50:21 -0400
Subject: [PATCH 1/4] MNT: hide getargspec usage for 3.6 compatibility

---
 .travis.yml             |  2 +-
 nose/plugins/manager.py | 16 ++++++++++++++--
 nose/util.py            | 29 ++++++++++++++++++++++++-----
 3 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/nose/plugins/manager.py b/nose/plugins/manager.py
index 04593f56..c7d882c7 100644
--- a/nose/plugins/manager.py
+++ b/nose/plugins/manager.py
@@ -104,8 +104,19 @@ def addPlugin(self, plugin, call):
         """
         meth = getattr(plugin, call, None)
         if meth is not None:
-            if call == 'loadTestsFromModule' and \
-                    len(inspect.getargspec(meth)[0]) == 2:
+            try:
+                sig = inspect.signature(meth)
+                bl = set([inspect.Parameter.VAR_KEYWORD,
+                          inspect.Parameter.VAR_POSITIONAL,
+                          inspect.Parameter.KEYWORD_ONLY])
+                args = [k for k, v in sig.parameters.items()
+                        if v.kind not in bl]
+                arg_len = len(args)
+                if hasattr(meth, '__self__'):
+                    arg_len += 1
+            except AttributeError:
+                arg_len = len(inspect.getargspec(meth)[0])
+            if call == 'loadTestsFromModule' and arg_len == 2:
                 orig_meth = meth
                 meth = lambda module, path, **kwargs: orig_meth(module)
             self.plugins.append((plugin, meth))
@@ -153,6 +164,7 @@ def generate(self, *arg, **kw):
                 if result is not None:
                     for r in result:
                         yield r
+
             except (KeyboardInterrupt, SystemExit):
                 raise
             except:
diff --git a/nose/util.py b/nose/util.py
index bfe16589..9ec9c3ed 100644
--- a/nose/util.py
+++ b/nose/util.py
@@ -449,16 +449,35 @@ def try_run(obj, names):
             if type(obj) == types.ModuleType:
                 # py.test compatibility
                 if isinstance(func, types.FunctionType):
-                    args, varargs, varkw, defaults = \
-                        inspect.getargspec(func)
+                    try:
+                        sig = inspect.signature(func)
+                        bl = set([inspect.Parameter.VAR_KEYWORD,
+                                  inspect.Parameter.VAR_POSITIONAL,
+                                  inspect.Parameter.KEYWORD_ONLY])
+                        args = [k for k, v in sig.parameters.items()
+                                if v.kind not in bl]
+                    except AttributeError:
+                        args, varargs, varkw, defaults = \
+                          inspect.getargspec(func)
+
                 else:
                     # Not a function. If it's callable, call it anyway
                     if hasattr(func, '__call__') and not inspect.ismethod(func):
                         func = func.__call__
                     try:
-                        args, varargs, varkw, defaults = \
-                            inspect.getargspec(func)
-                        args.pop(0) # pop the self off
+                        try:
+                            sig = inspect.signature(func)
+                            bl = set([inspect.Parameter.VAR_KEYWORD,
+                                      inspect.Parameter.VAR_POSITIONAL,
+                                      inspect.Parameter.KEYWORD_ONLY])
+                            args = [k for k, v in sig.parameters.items()
+                                    if v.kind not in bl]
+
+                        except AttributeError:
+                            args, varargs, varkw, defaults = \
+                                inspect.getargspec(func)
+                            # signature never returns it
+                            args.pop(0)  # pop the self off
                     except TypeError:
                         raise TypeError("Attribute %s of %r is not a python "
                                         "function. Only functions or callables"

From 8debb4e21b542e92f19502550d65a81f9ed2a2ed Mon Sep 17 00:00:00 2001
From: Tim Gates <tim.gates@iress.com>
Date: Mon, 4 Jul 2022 07:17:23 +1000
Subject: [PATCH 4/4] Update util.py

---
 nose/util.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/nose/util.py b/nose/util.py
index a05d763f..6a436fc2 100644
--- a/nose/util.py
+++ b/nose/util.py
@@ -476,7 +476,6 @@ def try_run(obj, names):
                         except AttributeError:
                             args, varargs, varkw, defaults = \
                                 inspect.getargspec(func)
-                            # signature never returns it
                             args.pop(0)  # pop the self off
                     except TypeError:
                         raise TypeError("Attribute %s of %r is not a python "
