diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f17f51b..ac6621f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,4 +9,3 @@ updates: directory: "/" # Location of package manifests schedule: interval: "weekly" - diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b41e1e7..cf55a99 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,11 +48,11 @@ jobs: # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. - + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild @@ -61,7 +61,7 @@ jobs: # ℹī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - # If the Autobuild fails above, remove it and uncomment the following three lines. + # If the Autobuild fails above, remove it and uncomment the following three lines. # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. # - run: | diff --git a/.idea/misc.xml b/.idea/misc.xml index 042e027..6031f78 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/.idea/rest-start.iml b/.idea/rest-start.iml index fe69426..99ce9c1 100644 --- a/.idea/rest-start.iml +++ b/.idea/rest-start.iml @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/djstartlib/main.py b/djstartlib/main.py index a992f80..a5d9dc0 100644 --- a/djstartlib/main.py +++ b/djstartlib/main.py @@ -16,8 +16,13 @@ help="Custom Environment Name", type=lambda p: pathlib.Path(p).absolute(), ) -@click.option("-v", "--virtualenv", is_flag=True, help="Install Environment Is Deprecated") -@click.option('-u', '--url-path', help='Set Custom URL Path for your App') +@click.option( + "-v", + "--virtualenv", + is_flag=True, + help="Install Environment Is Deprecated", +) +@click.option("-u", "--url-path", help="Set Custom URL Path for your App") def main(**kwargs): """ Prepare a new Django project quickly and automatically and, @@ -29,17 +34,16 @@ def main(**kwargs): fg="white", bg="red", ) - click.secho("Creating a virtual environment is a best practice!", - fg="green") + click.secho( + "Creating a virtual environment is a best practice!", fg="green" + ) app = DjangoStart( - kwargs['name'], - app=kwargs['app_name'], - project=kwargs['project_name'] + kwargs["name"], app=kwargs["app_name"], project=kwargs["project_name"] ) app.setup_project() - app.setup_app(app_url=kwargs['url_path'] or '') + app.setup_app(app_url=kwargs["url_path"] or "") if __name__ == "__main__": diff --git a/djstartlib/models/app_manager.py b/djstartlib/models/app_manager.py index 0ad688f..a28bb6d 100644 --- a/djstartlib/models/app_manager.py +++ b/djstartlib/models/app_manager.py @@ -3,22 +3,25 @@ import click from models.utils import Environment -from models.utils.helper import (build_view_func, build_views_urls, - executable_python_command, generate_html, - warn_stdout) +from models.utils.helper import ( + build_view_func, + build_views_urls, + executable_python_command, + generate_html, + warn_stdout, +) class AppManager(Environment): def __init__(self, *args, **kwargs): super().__init__(**kwargs) - self.__app_name = kwargs.get('app', None) + self.__app_name = kwargs.get("app", None) self.__workdir = os.path.join( - self.get_workdir(), - f'{self.get_app_name()}' + self.get_workdir(), f"{self.get_app_name()}" ) - self.__views = os.path.join(self.workdir, 'views.py') - self.__urls = os.path.join(self.workdir, 'urls.py') - self.__templates = os.path.join(self.workdir, 'templates') + self.__views = os.path.join(self.workdir, "views.py") + self.__urls = os.path.join(self.workdir, "urls.py") + self.__templates = os.path.join(self.workdir, "templates") @property def app_name(self) -> str: @@ -43,28 +46,22 @@ def urls(self) -> str: def create_app(self) -> None: if self.app_name not in os.listdir(self.get_workdir()): click.secho( - f"\U00002728 Create '{self.app_name}' App...", - fg="blue" + f"\U00002728 Create '{self.app_name}' App...", fg="blue" ) executable_python_command(f"manage.py startapp {self.app_name}") else: warn_stdout(f'"{self.app_name}" already exist!') def update_view(self) -> None: - click.secho( - f"\U0001F304 Create '{self.app_name}' Views...", - fg="blue" - ) + click.secho(f"\U0001F304 Create '{self.app_name}' Views...", fg="blue") self.read_file(self.views) if "# Create your views here.\n" in self.line_list: code_of_block = build_view_func().substitute( - app_name=self.app_name, - html_file="index.html" + app_name=self.app_name, html_file="index.html" ) self.replace_line( - self.index("# Create your views here.\n"), - code_of_block + self.index("# Create your views here.\n"), code_of_block ) self.write(self.views) @@ -72,26 +69,24 @@ def update_view(self) -> None: warn_stdout('"home" View is Exists!') def create_urls(self) -> None: - click.secho( - f"\U0001F517 Create {self.app_name} URLs...", - fg="blue" - ) + click.secho(f"\U0001F517 Create {self.app_name} URLs...", fg="blue") block_of_code = build_views_urls().substitute(view_name="home") self.write(self.urls, value=block_of_code) def create_templates(self) -> None: click.secho( - f"\U0001F389 Generate '{self.app_name}' Index Page...", - fg="blue" + f"\U0001F389 Generate '{self.app_name}' Index Page...", fg="blue" ) - index_path = f'{self.templates}{os.sep}{self.app_name}' + index_path = f"{self.templates}{os.sep}{self.app_name}" if not os.path.exists(self.templates): os.mkdir(self.templates) if not os.path.exists(index_path): os.mkdir(index_path) - self.write(f'{index_path}{os.sep}index.html', value=generate_html()) + self.write( + f"{index_path}{os.sep}index.html", value=generate_html() + ) else: - warn_stdout('Index.html is Already exists.') + warn_stdout("Index.html is Already exists.") diff --git a/djstartlib/models/djstart_interface.py b/djstartlib/models/djstart_interface.py index 39d3c03..5f168ba 100644 --- a/djstartlib/models/djstart_interface.py +++ b/djstartlib/models/djstart_interface.py @@ -14,7 +14,7 @@ def setup_project(self): self.project_cls.create_project() self.project_cls.requirements_extract() - def setup_app(self, app_url: str = ''): + def setup_app(self, app_url: str = ""): self.app_cls.create_app() self.project_cls.update_settings() self.project_cls.update_urls(path=app_url) diff --git a/djstartlib/models/project_manager.py b/djstartlib/models/project_manager.py index 67c85ff..1dc2881 100644 --- a/djstartlib/models/project_manager.py +++ b/djstartlib/models/project_manager.py @@ -3,26 +3,32 @@ import click from models.utils import Environment -from models.utils.helper import (executable_django_command, install_dep, - requirements_extract, upgrade_pip, - warn_stdout) +from models.utils.helper import ( + executable_django_command, + install_dep, + requirements_extract, + upgrade_pip, + warn_stdout, +) class ProjectManager(Environment): def __init__(self, *args, **kwargs): super().__init__(**kwargs) self.__urls = os.path.join( - self.get_workdir(), f'{self.get_project_name()}/urls.py' + self.get_workdir(), f"{self.get_project_name()}/urls.py" ) self.__settings = os.path.join( - self.get_workdir(), f'{self.get_project_name()}/settings.py' + self.get_workdir(), f"{self.get_project_name()}/settings.py" ) @property - def urls_path(self) -> str: return self.__urls + def urls_path(self) -> str: + return self.__urls @property - def settings_path(self) -> str: return self.__settings + def settings_path(self) -> str: + return self.__settings def update_settings(self) -> None: self.read_file(self.settings_path) @@ -34,15 +40,17 @@ def update_settings(self) -> None: warn_stdout(f'"{self.get_app_name()}" is installed!') def update_import_statment(self): - import_statment = 'from django.urls import include\n' - if 'from django.urls import path, include\n' in self.line_list: + import_statment = "from django.urls import include\n" + if "from django.urls import path, include\n" in self.line_list: return 0 elif import_statment not in self.line_list: - self.insert_line('from django.urls import path\n', import_statment) + self.insert_line("from django.urls import path\n", import_statment) def update_urls(self, path: str) -> None: self.read_file(self.urls_path) - view_path = f"\tpath('{path}', include('{self.get_app_name()}.urls')),\n" + view_path = ( + f"\tpath('{path}', include('{self.get_app_name()}.urls')),\n" + ) self.update_import_statment() if view_path not in self.line_list: @@ -68,7 +76,12 @@ def requirements_extract() -> None: def create_project(self) -> None: if self.get_project_name() not in os.listdir(self.get_workdir()): - click.secho(f"\U00002728 Create '{self.get_project_name()}' Project", fg="blue") - executable_django_command(f"startproject {self.get_project_name()} .") + click.secho( + f"\U00002728 Create '{self.get_project_name()}' Project", + fg="blue", + ) + executable_django_command( + f"startproject {self.get_project_name()} ." + ) else: warn_stdout(f'"{self.get_project_name()}" Already exist!') diff --git a/djstartlib/models/utils/environment.py b/djstartlib/models/utils/environment.py index 967d54b..87df9b3 100644 --- a/djstartlib/models/utils/environment.py +++ b/djstartlib/models/utils/environment.py @@ -3,17 +3,19 @@ class Environment: def __init__(self, **kwargs): - self.__app_name = kwargs.get('app') - self.__project_name = kwargs.get('project') + self.__app_name = kwargs.get("app") + self.__project_name = kwargs.get("project") self.__workdir = os.getcwd() - self.__exec = os.getenv('PYTHONEXEC') - self.__django_admin = os.getenv('DJANGOADMIN') + self.__exec = os.getenv("PYTHONEXEC") + self.__django_admin = os.getenv("DJANGOADMIN") self.__line_list = [] @property - def line_list(self) -> list: return self.__line_list + def line_list(self) -> list: + return self.__line_list - def index(self, value: str) -> int: return self.line_list.index(value) + def index(self, value: str) -> int: + return self.line_list.index(value) def insert_line(self, flag: str, value: str) -> None: self.line_list.insert(self.index(flag), value) @@ -31,25 +33,30 @@ def read_file(self, file: str) -> list: f.close() return self.line_list - def write(self, file_path: str, value = None) -> None: - with open(file_path, 'w') as f: - f.write(''.join(value or self.line_list)) + def write(self, file_path: str, value=None) -> None: + with open(file_path, "w") as f: + f.write("".join(value or self.line_list)) f.close() - def get_app_name(self) -> str: return self.__app_name + def get_app_name(self) -> str: + return self.__app_name - def get_project_name(self) -> str: return self.__project_name + def get_project_name(self) -> str: + return self.__project_name - def get_workdir(self) -> str: return self.__workdir + def get_workdir(self) -> str: + return self.__workdir - def get_exec(self) -> str: return self.__exec + def get_exec(self) -> str: + return self.__exec - def get_django_admin(self) -> str: return self.__django_admin + def get_django_admin(self) -> str: + return self.__django_admin def test(self): - print(f'Call {self.__class__.__name__}') - print(f'App Name: {self.get_app_name()}') - print(f'Project Name: {self.get_project_name()}') - print(f'Workdir: {self.get_workdir()}') - print(f'Python Path: {self.get_exec()}') - print(f'Django Admin: {self.get_django_admin()}') + print(f"Call {self.__class__.__name__}") + print(f"App Name: {self.get_app_name()}") + print(f"Project Name: {self.get_project_name()}") + print(f"Workdir: {self.get_workdir()}") + print(f"Python Path: {self.get_exec()}") + print(f"Django Admin: {self.get_django_admin()}") diff --git a/djstartlib/models/utils/helper.py b/djstartlib/models/utils/helper.py index d5b78bb..1c4547b 100644 --- a/djstartlib/models/utils/helper.py +++ b/djstartlib/models/utils/helper.py @@ -19,11 +19,18 @@ def create_env(env_name_path): shell=True, ) if platform.system() == "Windows": - os.environ['PYTHONEXEC'] = os.path.join(env_name_path, 'Scripts/python.exe') - os.environ.setdefault('DJANGOADMIN', os.path.join(env_name_path, 'Scripts/django-admin.exe')) + os.environ["PYTHONEXEC"] = os.path.join( + env_name_path, "Scripts/python.exe" + ) + os.environ.setdefault( + "DJANGOADMIN", + os.path.join(env_name_path, "Scripts/django-admin.exe"), + ) else: - os.environ['PYTHONEXEC'] = os.path.join(env_name_path, 'bin/python3') - os.environ.setdefault('DJANGOADMIN', os.path.join(env_name_path, 'bin/django-admin')) + os.environ["PYTHONEXEC"] = os.path.join(env_name_path, "bin/python3") + os.environ.setdefault( + "DJANGOADMIN", os.path.join(env_name_path, "bin/django-admin") + ) def executable_python_command(command): @@ -35,8 +42,12 @@ def executable_python_command(command): shell=True, ) if proc: - if platform.system() != 'Windows': - click.secho("check your installed python3-env and python3-pip", fg="white", bg="red") + if platform.system() != "Windows": + click.secho( + "check your installed python3-env and python3-pip", + fg="white", + bg="red", + ) sys.exit(1) except KeyError: click.secho("Be sure to set up PYTHONPATH", fg="white", bg="red") @@ -77,14 +88,17 @@ def build_view_func(): html_file :return: str """ - s = Template(f""" + s = Template( + f""" def home(request): - return render(request, '$app_name{os.sep}$html_file')""") + return render(request, '$app_name{os.sep}$html_file')""" + ) return s def build_views_urls(): - s = Template("""from django.urls import path + s = Template( + """from django.urls import path from . import views urlpatterns = [ diff --git a/djstartlib/version.py b/djstartlib/version.py index 9bfaa0e..8130448 100644 --- a/djstartlib/version.py +++ b/djstartlib/version.py @@ -9,7 +9,9 @@ def latest_version(): - res = request.urlopen("https://api.github.com/repos/islam-kamel/django-start/tags") + res = request.urlopen( + "https://api.github.com/repos/islam-kamel/django-start/tags" + ) version_name = json.load(res)[0]["name"] version_int = version_name.split(".") version_int[-1] = version_int[-1].split("-")[0] @@ -38,7 +40,7 @@ def check_available(): @click.command() @click.option("--update", is_flag=True, help="Install Latest Version") -@click.option('--check-update', is_flag=True, help="Check Update Available") +@click.option("--check-update", is_flag=True, help="Check Update Available") def main(update, check_update): """ Display current version, diff --git a/pyproject.toml b/pyproject.toml index 3292c83..638dd9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,3 @@ [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" -