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

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
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.