Skip to content

Commit

Permalink
Change click to argparse
Browse files Browse the repository at this point in the history
Change click to argparse
kirillsulim authored Nov 3, 2020
2 parents a82baad + e4b5e85 commit c0fdae5
Showing 3 changed files with 93 additions and 74 deletions.
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -34,7 +34,6 @@ def load_from(file_name):
],
python_requires="~=3.6",
install_requires=[
"click~=7.0",
"Jinja2~=2.10",
"gitsnapshot~=0.1.1",
"appdirs~=1.4.3",
164 changes: 92 additions & 72 deletions tapas/app.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from typing import Tuple, Callable, Optional
import click
import os
import sys
import json
import pkg_resources
from inspect import Parameter, signature
from encodings import utf_8
from pathlib import Path
from argparse import ArgumentParser

from jinja2 import Environment, StrictUndefined
from gitsnapshot import load_repo
@@ -25,98 +26,112 @@
UTF_8 = utf_8.getregentry().name


def _load_version():
version = pkg_resources.resource_string("tapas", "tapas.version")
version = version.decode(UTF_8).strip()
return version
class App:
def __init__(self, args):
self.version = self._load_version()
parser = self._init_parser(self.version)
parser.parse_args(args, self)

if not self.list and self.tapa is None:
parser.error("Missing tapa name")

def _list(ctx, param, value) -> None:
if not value:
return
def run(self) -> int:
if self.list:
return self._show_available_tapas()

index = _load_tapas_index()
table = []
for tapa_key in sorted(index.keys()):
table.append([tapa_key, index[tapa_key].description])
return self._apply_tapa()

print(tabulate(table, headers=["Tapa name", "Description"]))
def _show_available_tapas(self) -> int:
index = _load_tapas_index()
table = []
for tapa_key in sorted(index.keys()):
table.append([tapa_key, index[tapa_key].description])

ctx.exit()
print(tabulate(table, headers=["Tapa name", "Description"]))
return 0

def _apply_tapa(self) -> int:
schema, name = parse_schema(self.tapa)

@click.command()
@click.version_option(version=_load_version(), message="%(version)s")
@click.option(
"--list", "-l", is_flag=True, default=False, help="Show list of available tapas", callback=_list, is_eager=True
)
@click.option("--params", "-p", type=str, default=None, help="Parameters json", metavar="<json>")
@click.option("--force", "-f", is_flag=True, default=False, help="Rewrite files in target directory")
@click.argument("tapa", type=str)
@click.argument("target", type=str, default=".")
def main(tapa, target, params, force, list) -> int:
schema, name = parse_schema(tapa)
if schema is TapaSchema.INDEX:
schema, name = _get_tapa_from_index(name)

if schema is TapaSchema.INDEX:
schema, name = _get_tapa_from_index(name)
if name is None:
print('Unknown tapa "{}"'.format(self.tapa))
return 1

if name is None:
print('Unknown tapa "{}"'.format(tapa))
return 1
if schema is TapaSchema.DIRECTORY:
tapa_dir = _get_path(name)
elif schema is TapaSchema.GITHUB:
tapa_dir = _resolve_tapa_dir_from_github(name)
else:
raise NotImplementedError("Not implemented for {}".format(schema))

if schema is TapaSchema.DIRECTORY:
tapa_dir = _get_path(name)
elif schema is TapaSchema.GITHUB:
tapa_dir = _resolve_tapa_dir_from_github(name)
else:
raise NotImplementedError("Not implemented for {}".format(schema))
if tapa_dir is None:
print("Unknown tapa name {}".format(self.tapa))
return 1

if tapa_dir is None:
print("Unknown tapa name {}".format(tapa))
return 1
target_dir = _get_path(self.target)

target_dir = _get_path(target)
ask, post_init = _load_tapa(tapa_dir / TAPA_FILE)

ask, post_init = _load_tapa(tapa_dir / TAPA_FILE)
ContextHolder.init_context(prompt_mode=PromptMode.USER, values=_json_string_to_dict(self.params))

ContextHolder.init_context(prompt_mode=PromptMode.USER, values=_json_string_to_dict(params))
if ask is not None:
ask()

if ask is not None:
ask()
params = ContextHolder.CONTEXT.dict

params = ContextHolder.CONTEXT.dict
code = _walk(tapa_dir / TEMPLATE_DIR, target_dir, params, self.force)
if code:
return code

code = _walk(tapa_dir / TEMPLATE_DIR, target_dir, params, force)
if code:
return code
if post_init is not None:
sig = signature(post_init)

if post_init is not None:
sig = signature(post_init)

post_init_params = {}
for param in sig.parameters.values():
if param.kind == Parameter.VAR_KEYWORD:
post_init_params = params
break
elif param.kind in [Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY]:
if param.name in params:
post_init_params[param.name] = params[param.name]
post_init_params = {}
for param in sig.parameters.values():
if param.kind == Parameter.VAR_KEYWORD:
post_init_params = params
break
elif param.kind in [Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY]:
if param.name in params:
post_init_params[param.name] = params[param.name]
else:
if param.default == Parameter.empty:
raise Exception(
"Post init function can contain only params asked in ask function or with default value"
)
else:
if param.default == Parameter.empty:
raise Exception(
"Post init function can contain only params asked in ask function or with default value"
)
else:
raise Exception("Post init function can contain only named params and **kwargs")
raise Exception("Post init function can contain only named params and **kwargs")

cwd = os.getcwd()
os.chdir(target_dir)
code = post_init(**post_init_params)
os.chdir(cwd)
cwd = os.getcwd()
os.chdir(target_dir)
code = post_init(**post_init_params)
os.chdir(cwd)

if code is None:
code = 0
return code
if code is None:
code = 0
return code

@staticmethod
def _load_version() -> str:
version = pkg_resources.resource_string("tapas", "tapas.version")
version = version.decode(UTF_8).strip()
return version

@staticmethod
def _init_parser(version: str) -> ArgumentParser:
parser = ArgumentParser()
parser.add_argument("--version", action="version", version=version)
parser.add_argument("-l", "--list", action="store_true", help="show list of available tapas and exit")
parser.add_argument("-f", "--force", action="store_true", help="rewrite files in target directory")
parser.add_argument("-p", "--params", type=str, default=None, help="parameters json", metavar="JSON_OBJECT")
parser.add_argument("tapa", nargs="?", help="tapa name", metavar="TAPA")
parser.add_argument(
"target", type=Path, default=Path(os.getcwd()), nargs="?", help="target directory", metavar="TARGET"
)
return parser


def _walk(template_dir: Path, destination_dir: Path, params: dict, force: bool) -> int:
@@ -187,5 +202,10 @@ def _resolve_tapa_dir_from_github(repo_name: str) -> Optional[Path]:
return repo_dir


def main():
app = App(sys.argv[1:])
sys.exit(app.run())


if __name__ == "__main__":
main()
2 changes: 1 addition & 1 deletion tapas/tapas.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.1.7
0.1.8

0 comments on commit c0fdae5

Please sign in to comment.