diff --git a/test_in.py b/_test_in.py
similarity index 100%
rename from test_in.py
rename to _test_in.py
diff --git a/_test_out.py b/_test_out.py
new file mode 100755
index 0000000..94711d4
--- /dev/null
+++ b/_test_out.py
@@ -0,0 +1,5 @@
+#!/usr/bin/python
+
+for i in range(0, 10000):
+ print(f"\033[{(i % 7) + 30}mHello World!")
+ print(f"\033[{(i % 7) + 90}mHello World!")
diff --git a/pyproject.toml b/pyproject.toml
index acb06ef..3fb26fb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -29,3 +29,8 @@ sshare-validate = "sshare.validator:main"
[tool.setuptools_scm]
version_file = "src/sshare/version.py"
+
+[tool.pytest.ini_options]
+addopts = [
+ "--import-mode=importlib"
+]
diff --git a/src/sshare/plugin/config.py b/src/sshare/plugin/config.py
index 6df34ed..b12f099 100644
--- a/src/sshare/plugin/config.py
+++ b/src/sshare/plugin/config.py
@@ -12,6 +12,8 @@
# You should have received a copy of the GNU General Public License along with
# SSHare. If not, see .
+import argparse
+
class NoDefault: pass
def Flag(name=None, help=None):
@@ -33,6 +35,8 @@ class Argument:
self._short = None
self._long = name
+ self._is_remainder = kwargs.get("nargs", None) == argparse.REMAINDER
+
if not "default" in kwargs:
kwargs["default"] = NoDefault
kwargs["default"] = _None(kwargs["default"])
@@ -43,6 +47,8 @@ class Argument:
if self._long == None:
self._long = argument
self._kwargs["metavar"] = argument
+ if self._is_remainder:
+ self._long = self.dest()
def set_flags(self, short, long):
if short != None:
@@ -75,11 +81,13 @@ class Argument:
def add(self, arg_parser):
flags = []
- if self._short != None: flags.append(f"-{self._short}")
- if self._long != None: flags.append(f"--{self._long}")
- kwargs = self._kwargs | {
- "dest": self.dest()
- }
+ kwargs = self._kwargs
+ if self._is_remainder:
+ flags.append(self._long)
+ else:
+ if self._short != None: flags.append(f"-{self._short}")
+ if self._long != None: flags.append(f"--{self._long}")
+ kwargs["dest"] = self.dest()
arg_parser.add_argument(
*flags,
**kwargs
diff --git a/src/sshare/plugin/plugin.py b/src/sshare/plugin/plugin.py
index 3d75c6b..dc413c6 100644
--- a/src/sshare/plugin/plugin.py
+++ b/src/sshare/plugin/plugin.py
@@ -14,6 +14,9 @@
import importlib
import importlib.util
+import sys
+
+from pathlib import Path
from sshare.plugin.config import Flag
from sshare.plugin.config import NoDefault
@@ -32,6 +35,7 @@ class PluginLoader:
in ([ "command_line" ] if command_line else []) + [
"file",
"stdin",
+ "wrap_command",
"current_time",
"append_type",
"ssh",
@@ -49,9 +53,9 @@ class PluginLoader:
]
@staticmethod
- def at(logger=None, config=dict(), flags=dict(), *args):
+ def at(*args, logger=None, config=dict(), flags=dict()):
return [
- Plugin.external(plugin, logger, config, flags)
+ Plugin.external(Path(plugin), logger, config, flags)
for plugin
in args
]
diff --git a/src/sshare/plugins/stdin.py b/src/sshare/plugins/stdin.py
index 7b219b6..d4edc64 100644
--- a/src/sshare/plugins/stdin.py
+++ b/src/sshare/plugins/stdin.py
@@ -21,7 +21,7 @@ plugin_type = "source"
activate = { "stdin" }
config = {
- "suffix": "txt"
+ "suffix": "txt",
}
args = {
"stdin": Flag(help="Upload from stdin")
diff --git a/src/sshare/plugins/wrap_command.py b/src/sshare/plugins/wrap_command.py
new file mode 100644
index 0000000..410874b
--- /dev/null
+++ b/src/sshare/plugins/wrap_command.py
@@ -0,0 +1,50 @@
+# This file is part of SSHare.
+#
+# SSHare is free software: you can redistribute it and/or modify it under the terms of
+# the GNU General Public License as published by the Free Software Foundation,
+# either version 3 of the License, or (at your option) any later version.
+#
+# SSHare is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# SSHare. If not, see .
+
+import argparse
+import locale
+import subprocess
+
+from sshare.plugin.config import Argument
+from sshare.plugin.source import Raw
+
+plugin_type = "source"
+
+activate = { "command" }
+config = {
+ "suffix": "txt",
+}
+args = {
+ "command": Argument(
+ nargs=argparse.REMAINDER,
+ help="Upload the contents of the wrapped command",
+ )
+}
+
+def init():
+ config.command = config.command[1:]
+
+def get_source():
+ output = b""
+ with subprocess.Popen(
+ config.command,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=0,
+ ) as process:
+ for line in process.stdout:
+ print(line.decode(locale.getpreferredencoding()), end="")
+ output += line
+
+ return Raw(config.suffix, output)
diff --git a/src/sshare/validator.py b/src/sshare/validator.py
index f4e21fd..b003ba2 100644
--- a/src/sshare/validator.py
+++ b/src/sshare/validator.py
@@ -113,7 +113,7 @@ def main():
arg_parser.add_argument(
"plugins",
nargs="*",
- help="plugin(s) to be validated",
+ help="plugin(s) to be validated (Default: all external plugins)",
)
arguments = arg_parser.parse_args()
if arguments.dev:
diff --git a/test_out.py b/test_out.py
deleted file mode 100755
index f89bd5d..0000000
--- a/test_out.py
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/python
-
-for i in range(0, 5):
- print("\033[91mHello World!")
diff --git a/tests/test_test.py b/tests/test_test.py
new file mode 100644
index 0000000..3c71169
--- /dev/null
+++ b/tests/test_test.py
@@ -0,0 +1,4 @@
+from src.sshare.plugin.config import Argument
+
+def test_foo():
+ assert True