Add rudimentary support for specifications

This commit is contained in:
Gnarwhal 2024-09-25 01:51:12 +00:00
parent 0f3b523d68
commit 92f5e1f47a
Signed by: Gnarwhal
GPG key ID: 0989A73D8C421174
8 changed files with 81 additions and 19 deletions

@ -1 +1 @@
Subproject commit 3273aa4e4c1898c484e989340a8525edb343cebe Subproject commit 99f2e9c3d2fbab02b0582dc8dcf9ed05df7789a6

View file

@ -40,6 +40,31 @@ def main():
arguments, _ = arg_parser.parse_known_args() arguments, _ = arg_parser.parse_known_args()
with open(arguments.config or config_directory.default_config(), mode="rb") as file: with open(arguments.config or config_directory.default_config(), mode="rb") as file:
config = tomllib.load(file) config = tomllib.load(file)
config["spec"] = config.get("spec", {})
for spec_name, spec in config["spec"].items():
if spec_name != "default":
flags = []
if spec.get("flag", {}).get("short") != None:
flags = flags + [ f"-{spec["flag"]["short"]}" ]
if spec.get("flag", {}).get("long") != None:
flags = flags + [ f"--{spec["flag"]["long"]}" ]
arg_parser.add_argument(
*flags,
action="store_const",
const=True,
default=False,
help=spec.get(help, f"Use {spec_name} spec"),
dest=spec_name,
)
use_spec = config["spec"].get("default", {})
arguments, _ = arg_parser.parse_known_args()
for spec_name, spec in config["spec"].items():
if spec_name != "default":
if getattr(arguments, spec_name):
use_spec = spec
config["config"] = config.get("config", {}) config["config"] = config.get("config", {})
config["flags" ] = config.get("flags", {}) config["flags" ] = config.get("flags", {})
@ -69,8 +94,9 @@ def main():
logger.add(command_line) logger.add(command_line)
plugins = PluginManager( plugins = PluginManager(
logger, logger,
use_spec,
config["config"], config["config"],
config["flags"], config["flags" ],
arg_parser, arg_parser,
) )
plugins.activate("logger") plugins.activate("logger")

View file

@ -35,8 +35,9 @@ class PluginLoader:
in ([ "command_line" ] if command_line else []) + [ in ([ "command_line" ] if command_line else []) + [
"file", "file",
"stdin", "stdin",
"current_time", "preserve",
"append_type", "time",
"extension",
"ssh", "ssh",
"uri", "uri",
"print_location", "print_location",
@ -60,7 +61,7 @@ class PluginLoader:
] ]
class PluginManager: class PluginManager:
def __init__(self, logger, config, flags, arg_parser): def __init__(self, logger, spec, config, flags, arg_parser):
self._logger = logger self._logger = logger
self._arg_parser = arg_parser self._arg_parser = arg_parser
@ -71,14 +72,22 @@ class PluginManager:
for type in Plugin.types(): for type in Plugin.types():
setattr(self, type, PluginState()) setattr(self, type, PluginState())
self._uninitialized = PluginLoader.all( self._uninitialized = []
uninitialized = PluginLoader.all(
command_line=False, command_line=False,
logger=logger, logger=logger,
config=config, config=config,
flags=flags, flags=flags,
) )
for plugin in self._uninitialized: for plugin in uninitialized:
plugin.add_args(arg_parser) plugin.add_args(arg_parser)
if not "name" in plugin.plugin_type:
self._uninitialized.append(plugin)
for name in spec.get("name", []):
for plugin in uninitialized:
if plugin.name == name:
self._uninitialized.append(plugin)
def activate(self, activate_type=None): def activate(self, activate_type=None):
args = self._arg_parser.parse_args() args = self._arg_parser.parse_args()

View file

@ -15,7 +15,8 @@
from pathlib import Path from pathlib import Path
class Raw: class Raw:
def __init__(self, type, data): def __init__(self, name, type, data):
self.name = name
self.type = type self.type = type
self.data = data self.data = data

View file

@ -0,0 +1,32 @@
# 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 <https://www.gnu.org/licenses/>.
from sshare.plugin.source import File
from sshare.plugin.source import Raw
plugin_type = "name"
def get_name(name, source):
if name != "":
name = name + "_"
else:
name = ""
if isinstance(source, File):
components = source.path.name.split(".")
if components[0] == "":
return name + "." + components[1]
else:
return name + components[0]
else:
return name + source.name

View file

@ -28,4 +28,4 @@ args = {
} }
def get_source(): def get_source():
return Raw(config.suffix, sys.stdin.buffer.read()) return Raw("stdin", config.suffix, sys.stdin.buffer.read())

View file

@ -20,18 +20,12 @@ from sshare.plugin.source import File
plugin_type = "name" plugin_type = "name"
config = { config = {
"base": 62, "format": 62,
} }
def init():
if not isinstance(config.base, int):
logger.fatal("Error: 'base' must be an integer")
elif config.base < 2:
logger.fatal("Error: 'base' cannot be less than 2")
elif config.base > 62:
logger.fatal("Error: 'base' cannot be greater than 62")
def get_name(name, source): def get_name(name, source):
if name != "":
name = name + "_"
return name + _rebase(config.base, time.time_ns()) return name + _rebase(config.base, time.time_ns())
def _rebase(base, number): def _rebase(base, number):