diff --git a/cls/__init__.py b/cls/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cls/releases.py b/cls/releases.py new file mode 100644 index 0000000..be5c904 --- /dev/null +++ b/cls/releases.py @@ -0,0 +1,65 @@ +from dataclasses import dataclass + +import httpx + + +@dataclass +class PyPiParser: + """ + A client for the PyPi API + + Attributes: + package_name: The name of the package + base_url: The base url for the PyPi json API + """ + + package_name: str = "wagtail" + base_url: str = f"https://pypi.org/pypi/{package_name}/json" + + def __post_init__(self) -> None: + resp = httpx.get(self.base_url) + self.base_response = resp.json() + self.base_versions = self._reduce_versions( + list(self.base_response["releases"].keys()) + ) + self.release_groups = self.parse_release_groups() + self.latest_release = self.parse_latest_release() + + def _reduce_versions(self, versions: list) -> list: + reduced_versions = [] + for version in versions: + if "rc" not in version and "b" not in version and "a" not in version: + # remove pre-release versions + reduced_versions.append(version) + + return reduced_versions + + def parse_release_groups(self): + grouped_releases = {} + for item in self.base_versions: + first_digit = item.split(".")[0] + if first_digit in grouped_releases: + grouped_releases[first_digit].append(item) + else: + grouped_releases[first_digit] = [item] + + # sort grouped_releases by first digit desc + grouped_releases = dict( + sorted(grouped_releases.items(), key=lambda x: int(x[0]), reverse=True) + ) + return grouped_releases + + def parse_latest_release(self): + major = list(self.release_groups.keys())[0] + releases = self.release_groups[major] + return releases[-1] + + def get_release_group(self, major): + return self.release_groups[major] + + +if __name__ == "__main__": + pypi = PyPiParser() + # print(pypi.base_versions) + # print(pypi.release_groups) + print(pypi.get_release_group("2")) diff --git a/draw.excalidraw b/draw.excalidraw new file mode 100644 index 0000000..c5a6c23 --- /dev/null +++ b/draw.excalidraw @@ -0,0 +1,48 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "qUEZkkdqvw44t6ZO41S2f", + "type": "text", + "x": 301.78125, + "y": 170.6875, + "width": 415.379638671875, + "height": 325, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 267863646, + "version": 247, + "versionNonce": 1454692418, + "isDeleted": false, + "boundElements": null, + "updated": 1716150701075, + "link": null, + "locked": false, + "text": "Version - option or latest\n\npackage-name or default\n\napp-name or default\n\ninstall the version\n\nwagtail-start [generated/package-name]\n\nmove folders/fies around (maybe later on)\n\nmove package to parent", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 318, + "containerId": null, + "originalText": "Version - option or latest\n\npackage-name or default\n\napp-name or default\n\ninstall the version\n\nwagtail-start [generated/package-name]\n\nmove folders/fies around (maybe later on)\n\nmove package to parent", + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} diff --git a/gen.py b/gen.py new file mode 100644 index 0000000..e69de29 diff --git a/poetry.lock b/poetry.lock index f130de6..4132f43 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,26 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.3.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "black" @@ -259,6 +281,62 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.11.0,<2.12.0" pyflakes = ">=3.1.0,<3.2.0" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "idna" version = "3.4" @@ -459,6 +537,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -534,6 +613,17 @@ urllib3 = ">=1.25.10,<3.0" [package.extras] tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-requests"] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -587,4 +677,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "27cace3bdfe04d78c308bcd826abe2713f5e582ecea0bf8dcc279262e3635583" +content-hash = "5f93fda36936a715160390efef19cc988d1f7c14542f651ea6153d545a8eda96" diff --git a/pyproject.toml b/pyproject.toml index e2f5353..b0a0339 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ click = "^8.1.7" requests = "^2.31.0" +httpx = "^0.27.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.3" pytest-cov = "^4.1.0" diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/start.py b/src/start.py new file mode 100644 index 0000000..0326c26 --- /dev/null +++ b/src/start.py @@ -0,0 +1,15 @@ +import click + + +@click.command() +@click.option("--release", "-r", type=str) +def generate(release: str) -> None: + """Generate a new wagtail site + + CMD: generate --release + """ + click.echo( + click.style( + f"Generating a new wagtail site with release {release}", fg="yellow" + ) + )