diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7e815d4 --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ + +.PHONY: help + +help: ## *:・゚✧*:・゚✧ This help *:・゚✧*:・゚✧ + @printf "\033[36;1m %14s \033[0;32;1m %s\033[0m\n" Target Description + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ + awk ' \ + BEGIN {FS = ":.*?## "}; \ + { if ( $$1 != "-") { \ + printf "\033[31;1;40m[ \033[36;1;40m%14s \033[31;1;40m]\033[0;32;1m %s\033[0m\n", $$1, $$2 \ + } else { \ + printf " \033[0;33;1m=^= %-25s =^=\033[0m\n", $$2 \ + } \ + } \ + ' + +-: ## Building +################################### + +clean: ## Clean build folders + rm -r build tsmark.egg-info + +build: ## Build + hatchling build + +pip: ## Install with pip + pip install . + +pipx: ## Install with pipx + pipx install -f . + + + diff --git a/README.md b/README.md index 125052b..6080496 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,8 @@ Basic function: # Installation -- Create a folder that is publicily visible on a web server, like Nginx. -- Copy the flit.example as executable `flit`, and add the public URL in the - script. -- Have the flit.py in the same folder. -- Add a symlink to flit script so that it is in the PATH, i.e. `ln -s $(pwd)/flit ~/.local/bin/flit` +- Install module with pip or pipx +- Create a folder that is publicily visible on a web server, for example Nginx. - Add `flit del` to daily cron # Usage diff --git a/flit.example b/flit.example deleted file mode 100755 index b6399d0..0000000 --- a/flit.example +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - - -pwd=$( dirname $( readlink -f $0 ) ) -python3 "$pwd"/flit.py --home "/path/to/share" --root "https://your.server/and.path" "$@" diff --git a/flit/__init__.py b/flit/__init__.py new file mode 100644 index 0000000..dcd63c4 --- /dev/null +++ b/flit/__init__.py @@ -0,0 +1,7 @@ +from flit.flit import main + +__version__ = "20241202.0" + + +def flit(): + main() diff --git a/flit.py b/flit/flit.py similarity index 87% rename from flit.py rename to flit/flit.py index 0759168..80b5085 100755 --- a/flit.py +++ b/flit/flit.py @@ -1,27 +1,40 @@ #!/usr/bin/env python3 -from datetime import datetime, timedelta import argparse +import json import os import random import shutil import string +from datetime import datetime, timedelta from urllib.parse import quote -import json """FLIT: Fluttering folders for simple file sharing. The script maintains a set of folders, named so that they are hard to guess, and contents are deleted after expiration date. -Attributes: - CONFIG (str): Configuration file name stored in each shared folder. - """ +__version__ = "20241202.0" + + +GLOBAL_CONFIG = os.path.expanduser("~/.config/flit/config.json") CONFIG = ".flit.json" -def parse_opts(): +def write_default_global_config(): + os.makedirs(os.path.dirname(GLOBAL_CONFIG), exist_ok=True) + with open(os.path.join(GLOBAL_CONFIG), "wt") as fp: + json.dump({"ROOT_URL": "https://my.website.net", "HOME_DIR": os.getcwd()}, fp, indent=2, sort_keys=True) + print(f"New template config written. See '{GLOBAL_CONFIG}'") + + +def read_default_global_config(): + with open(os.path.join(GLOBAL_CONFIG), "rt") as fp: + return json.load(fp) + + +def parse_opts(global_config): """Options parser Args: @@ -38,9 +51,7 @@ def parse_opts(): print("") # retrieve subparsers from parser subparsers_actions = [ - action - for action in parser._actions - if isinstance(action, argparse._SubParsersAction) + action for action in parser._actions if isinstance(action, argparse._SubParsersAction) ] for subparsers_action in subparsers_actions: # get all subparsers and print help @@ -51,9 +62,7 @@ def parse_opts(): parser.exit() parser = argparse.ArgumentParser(add_help=False) - parser.add_argument( - "--help", "-h", action=_HelpAction, help="Show this help message and exit" - ) + parser.add_argument("--help", "-h", action=_HelpAction, help="Show this help message and exit") parser.add_argument( "--verbose", "-v", @@ -69,16 +78,16 @@ def parse_opts(): action="store", dest="root", type=str, - default="", - help="Root address for printing URLS", + default=global_config["ROOT_URL"], + help=f"Root address for printing URLS. Your webserver should map this to --home. Default '%(default)s' from {GLOBAL_CONFIG}", ) parser.add_argument( "--home", action="store", dest="home", type=str, - default=None, - help="Home folder for flit. This is where folders are created, and --root should point to in the filesystem. Defaults to script location", + default=global_config["HOME_DIR"], + help=f"Home folder for flit. This is where the folders are created. Default '%(default)s' from {GLOBAL_CONFIG}", ) subparsers = parser.add_subparsers(dest="command", help="Command defaults to add") @@ -157,9 +166,7 @@ def random_name(): """ while True: existing_names = [c["name"] for c in get_folders()] - existing_numbers = [ - tryint(num[0:3]) for num in existing_names if tryint(num[0:3]) != None - ] + existing_numbers = [tryint(num[0:3]) for num in existing_names if tryint(num[0:3]) != None] if len(existing_numbers) == 0: index = 0 else: @@ -403,8 +410,14 @@ def tryint(s): return None -if __name__ == "__main__": - opts = parse_opts() +def main(): + try: + global_config = read_default_global_config() + except FileNotFoundError: + write_default_global_config() + global_config = read_default_global_config() + + opts = parse_opts(global_config) cwd = os.getcwd() if opts.home == None: os.chdir(os.path.dirname(__file__)) diff --git a/index.html b/index.html deleted file mode 100644 index e69de29..0000000 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..190a1d9 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,35 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "flit" +dynamic = ["version"] +description = 'Create fluttering folders' +requires-python = ">=3.8" +license = "MIT" +keywords = [] +authors = [ + { name = "Q", email = "q@six9.net" }, +] +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", +] +dependencies = ["tqdm"] + +[project.scripts] +flit = "flit:flit" + +[tool.hatch.version] +path = "flit/__init__.py" + +[tool.hatch.build.targets.wheel] +packages = ["flit"]