diff --git a/docs/changelog/changelog.mdx b/docs/changelog/changelog.mdx index f0e9d3d6d..f0178f4f0 100644 --- a/docs/changelog/changelog.mdx +++ b/docs/changelog/changelog.mdx @@ -4,6 +4,229 @@ icon: "clock" iconType: "solid" --- - - Changelog first generated + +### [Simplified Slack notifications](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.26) +- Simplified Slack notifications by removing description field + + + + +### [JSX parsing improvements and workflow optimizations](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.25) +- Fixed JSX prop parsing mechanism +- Added semantic release workflow improvements +- Fixed handling of empty collections +- Added performance optimizations with Mypyc/Cython +- Improved CI/CD pipeline configuration + + + + +### [Adds Python 3.13 and ARM64 support with feature improvements](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.24) +- Added support for Python 3.13 and ARM64 architecture builds +- Added documentation for incremental recomputation +- Introduced feature flag for generics support +- Fixed issues with duplicate edge creation +- Improved pre-commit hook functionality and stability + + + + +### [Adds symbol flags and improves debugging capabilities](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.23) +- Added new symbol flag functionality for Python and TypeScript +- Introduced duplicate dependencies strategy for file movement +- Enhanced debugging capabilities and server health monitoring +- Improved documentation with new guides and usage examples +- Fixed various issues with codemod file creation and sandbox server + + + + +### [Improves testing and fixes release-related issues](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.22) +- Fixed changelog generation and wheel release issues +- Improved test suite with timeouts and standardized move_to_file tests +- Enhanced CI/CD pipeline configuration + + + + +### [Adds ephemeral server and improves documentation](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.21) +- Added ephemeral server functionality +- Improved documentation generation with better type resolution and class docstrings +- Enhanced CI/CD workflows and testing infrastructure + + + + +### [ARM support for Linux](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.19) +- Added ARM support for Linux platforms +- Enhanced documentation with architecture docs and improved docstrings +- Updated OpenAI dependency to version 1.61.0 + + + + +### [Adds system prompt generation and improves core functionality](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.18) +- Added automatic system prompt generation and gist client integration +- Restored namespace module support functionality +- Removed dynamic widget component from home page +- Fixed parse error handling +- Enhanced documentation and workflow improvements + + + + +### [Platform and file handling improvements](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.17) +- Enhanced file handling with improved TSourceFile return type +- Updated platform support capabilities +- Added community resources for contributors + + + + +### [Pydantic v2 migration and documentation updates](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.16) +- Update to Pydantic v2 imports and config handling +- Documentation and example improvements +- Configuration file updates + + + + +### [Removes auth requirement and fixes path handling](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.15) +- Remove authentication requirement for create command +- Fix path handling and directory creation +- Resolve validator import issues + + + + +### [Validation system improvements](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.14) +- Updated validation system to use BeforeValidator instead of PlainValidator + + + + +### [Updates to Pydantic v2 and documentation improvements](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.13) +- Updated to Pydantic v2 for span handling +- Added documentation for import loops +- Improved IDE installation instructions + + + + +### [Documentation improvements and module resolution fixes](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.12) +- Enhanced documentation with improved visualization linking and codebase examples +- Fixed module resolution issues +- Updated VSCode installation guide with Python extensions +- Improved documentation metadata and thumbnail images + + + + +### [Adds graph disabling feature and fixes command handling](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.11) +- Add disable_graph feature flag to reduce memory usage and parsing time +- Fix bug in create command response handling + + + + +### [Adds language detection and improves file handling](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.10) +- Added package.json-based repository language detection +- Improved file editing capabilities with new raw text edit features +- Enhanced documentation with function decorator guide and codebase visualization tutorial +- Fixed GitHub 404 error handling +- Added type fixes for codebase initialization + + + + +### [Documentation improvements and dynamic import support](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.9) +- Improved documentation with new guides and clarifications on file types +- Added support for dynamic import detection +- Added reset command to CLI +- Improved integration tests for better contributor experience +- Fixed widget URLs and various documentation improvements + + + + +### [Fixes branch sync and improves documentation](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.8) +- Fix branch synchronization clone URL issue +- Enhance documentation guides +- Update development dependencies + + + + +### [Improves runner functionality and build process](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.7) +- Enhanced runner module functionality and synchronization +- Added automatic function imports generation during build process +- Updated documentation and README + + + + +### [New codebase initialization workflow and analytics integration](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.6) +- Introduced new codebase initialization workflow +- Added PostHog integration and override functionality +- Enhanced documentation for session options +- Improved sandbox runner synchronization + + + + +### [Adds create flag and improves Git repository handling](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.5) +- Added `-d` flag to `codegen create` command +- Fixed Gradio integration issues +- Improved automatic base path detection for Git repositories +- Enhanced codebase reset functionality to only affect SDK changes +- Updated documentation and README + + + + +### [Adds venv management and TypeScript export support](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.4) +- Added virtual environment creation and persistence for `codegen init` +- Added support for codebase exports in TypeScript projects +- Reorganized test structure for better maintainability +- Updated graph widget configuration and URLs + + + + +### [Graph widget and system prompt features added](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.3) +- Added graph widget visualization feature +- Enhanced documentation with improved readability and new guides +- Added system prompt functionality +- Fixed core commands: codegen run and create +- Various internal code cleanup and reorganization + + + + +### [Adds notebook functionality and improves documentation](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.2) +- Added new codegen notebook functionality +- Fixed several documentation rendering issues and broken links +- Added function call parameter documentation helpers +- Fixed various type annotations and AST-related bugs +- Added README files for codegen modules + + + + +### [Adds remote codebase support and improves documentation](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.1) +- Added support for fetching remote codebases +- Fixed documentation and GitHub link parsing issues +- Improved test organization and coverage +- Added missing documentation pages +- Resolved repository configuration issues + + + + +### [Major documentation overhaul and API improvements](https://github.com/codegen-sh/codegen-sdk/releases/tag/v0.5.0) +- New documentation system with MDX support and interactive codemod widget +- Simplified API with improved module organization and naming +- Added Codebase and CLI functionality for easier code manipulation +- Introduced fetch_codebase feature for remote repository handling +- Enhanced documentation with new guides and examples diff --git a/pyproject.toml b/pyproject.toml index 4a8ba3650..c33b6f928 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ dependencies = [ "starlette<1.0.0,>=0.16.0", "tqdm>=4.67.1", "tomlkit>=0.13.2", + "python-semantic-release", "uvicorn[standard]>=0.30.0", ] @@ -143,6 +144,7 @@ dev-dependencies = [ "emoji>=2.14.0", "pytest-benchmark[histogram]>=5.1.0", "loguru>=0.7.3", + "httpx<0.28.0,>=0.25.1", ] @@ -233,3 +235,20 @@ manylinux-aarch64-image = "quay.io/pypa/manylinux_2_34_aarch64" [tool.cibuildwheel.linux] before-all = "curl -sSf https://sh.rustup.rs | sh -s -- -y" environment = { "PATH" = "$HOME/.cargo/bin:$PATH" } + +[tool.semantic_release] +assets = [] +build_command_env = [] +commit_message = "{version}\n\nAutomatically generated by python-semantic-release" +commit_parser = "angular" +logging_use_named_masks = false +major_on_zero = true +allow_zero_version = true +repo_dir = "." +no_git_verify = false +tag_format = "v{version}" + +[tool.semantic_release.branches.develop] +match = "develop" +prerelease_token = "rc" +prerelease = false diff --git a/src/codegen/gscli/generate/commands.py b/src/codegen/gscli/generate/commands.py index 0d84e1c52..04a109553 100644 --- a/src/codegen/gscli/generate/commands.py +++ b/src/codegen/gscli/generate/commands.py @@ -11,6 +11,8 @@ from codegen.gscli.generate.runner_imports import _generate_runner_imports from codegen.gscli.generate.system_prompt import get_system_prompt from codegen.gscli.generate.utils import LanguageType, generate_builtins_file +from codegen.sdk.ai.helpers import AnthropicHelper +from codegen.sdk.code_generation.changelog_generation import generate_changelog from codegen.sdk.code_generation.codegen_sdk_codebase import get_codegen_sdk_codebase from codegen.sdk.code_generation.doc_utils.generate_docs_json import generate_docs_json from codegen.sdk.code_generation.mdx_docs_generation import render_mdx_page_for_class @@ -195,3 +197,46 @@ def generate_codegen_sdk_docs(docs_dir: str) -> None: json.dump(mint_data, mint_file, indent=2) print(colored("Updated mint.json with new page sets", "green")) + + +@generate.command() +@click.option("--docs-dir", default="docs", required=False) +@click.option("--anthropic-key", required=True) +@click.option("--complete", is_flag=True, help="Generate a complete changelog for the codegen_sdk API") +def changelog(docs_dir: str, anthropic_key: str, complete: bool = False) -> None: + """Generate the changelog for the codegen_sdk API and update the changelog.mdx file""" + print(colored("Generating changelog", "green")) + header = """--- +title: "Codegen Updates" +icon: "clock" +iconType: "solid" +--- +""" + # Generate the changelog for the codegen_sdk API and update the changelog.mdx file + client = AnthropicHelper(anthropic_key=anthropic_key, cache=True, openai_anthropic_translation=False) + + if complete: + entire_release_history = generate_changelog(client) + new_changelog = header + entire_release_history + else: + # Read existing changelog and append new releases + with open(os.path.join(docs_dir, "changelog/changelog.mdx")) as f: + # read the existing changelog + existing_changelog = f.read() + # Remove header from existing changelog + existing_changelog = existing_changelog.split(header)[1] + # find the latest existing version + latest_existing_version = re.search(r'label="(v[\d.]+)"', existing_changelog) + # if there is a latest existing version, generate new releases + if latest_existing_version: + # generate new releases + new_releases = generate_changelog(client, latest_existing_version.group(1)) + # append new releases to the existing changelog + new_changelog = header + new_releases + existing_changelog + else: + # if there is no latest existing version, generate a complete changelog + new_releases = generate_changelog(client) + new_changelog = header + new_releases + + with open(os.path.join(docs_dir, "changelog/changelog.mdx"), "w") as f: + f.write(new_changelog) diff --git a/src/codegen/sdk/code_generation/changelog_generation.py b/src/codegen/sdk/code_generation/changelog_generation.py new file mode 100644 index 000000000..472273986 --- /dev/null +++ b/src/codegen/sdk/code_generation/changelog_generation.py @@ -0,0 +1,147 @@ +import json +import logging +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING + +from git import Repo +from semantic_release import ParsedCommit, ParseError +from semantic_release.changelog.release_history import Release, ReleaseHistory +from semantic_release.cli.cli_context import CliContextObj +from semantic_release.cli.config import GlobalCommandLineOptions + +import codegen +from codegen.sdk.ai.helpers import AnthropicHelper + +if TYPE_CHECKING: + import anthropic + +logger = logging.getLogger(__name__) + +SYSTEM_PROMPT = """ +## Role +You are a Release Manager for an open source project and have a gift for gleaning the most important and relevant changes from a list of commits. + +## Objective +You will be given a list of commits for a specifc release and you will need to write a high level summary of the changes in 1 to 5 bullet points and generate a very concise description of the release. +The description should be a maximum of 60 characters and should only highlight the most important change(s). +Please do not include specific details about pull requests or commits, only summarize the changes in the context of the release. + +## Instructions +- Do not include specific details about pull requests or commits, only summarize the changes in the context of the release. +- Do not include any other text than the bullet points and the one sentence description of the release.f +- Do not include pull request links or numbers. +- Only include information that is relevant to users and contributors. +- The description should be a maximum of 60 characters. + +## Output +- Output the bullet points and the one sentence description of the release, no other text. The output should be a json object with the following keys: + - `bullet_points`: A list of bullet points + - `description`: A one sentence description of the release + +## Example Outputs +``` +{ + "bullet_points": [ + "Add new feature X", + "Fix bug Y", + "Improve performance" + ], + "description": "adds a new feature, fixes a bug, and improves performance." +} +``` + +## Things to exclude +- Removed development package publishing to AWS +- Updated various dependencies and pre-commit hooks + +## Poor Release Descriptions +- "This release includes platform support updates, file handling improvements, and module resolution adjustments." +- "This release adds ARM support for Linux, enhances documentation, and includes dependency updates." + +## Better Release Descriptions +- "Platform support updates" +- "ARM support for Linux" +""" + + +@dataclass +class ContextMock: + config_file = "/Users/jesusmeza/Documents/codegen-sdk/pyproject.toml" + + def get_parameter_source(self, param_name): + if hasattr(self, param_name): + return getattr(self, param_name) + return None + + +def generate_release_summary_context(release: Release): + release_summary_context = {"version": release["version"].tag_format, "date": release["tagged_date"].strftime("%B %d, %Y"), "commits": dict()} + elements = release["elements"] + for title, commits in elements.items(): + release_summary_context["commits"][title] = [] + for parsed_commit in commits: + if isinstance(parsed_commit, ParsedCommit): + release_summary_context["commits"][title].append(parsed_commit.descriptions[0]) + elif isinstance(parsed_commit, ParseError): + release_summary_context["commits"][title].append(parsed_commit.message) + return release_summary_context + + +def generate_release_summary(client: AnthropicHelper, release: Release): + release_summary_context = generate_release_summary_context(release) + response: anthropic.types.message.Message = client.llm_query_no_retry( + system_prompt=SYSTEM_PROMPT, + model="claude-3-5-sonnet-20241022", + max_tokens=1000, + messages=[ + { + "role": "user", + "content": f""" +Here is some context on the release: + +{json.dumps(release_summary_context)} + +Please write a high level summary of the changes in 1 to 5 bullet points. +""", + } + ], + ) + if not response.content: + msg = "No response from Anthropic" + raise Exception(msg) + + return json.loads(response.content[0].text) + + +def generate_changelog(client: AnthropicHelper, latest_existing_version: str | None = None): + ctx = CliContextObj(ContextMock(), logger=logger, global_opts=GlobalCommandLineOptions()) + runtime = ctx.runtime_ctx + translator = runtime.version_translator + with Repo(Path(codegen.__file__).parents[2]) as codegen_sdk_repo: + release_history = ReleaseHistory.from_git_history( + repo=codegen_sdk_repo, + translator=translator, + commit_parser=runtime.commit_parser, + exclude_commit_patterns=runtime.changelog_excluded_commit_patterns, + ) + + releases = [] + parsed_releases: list[Release] = release_history.released.values() + parsed_releases = sorted(parsed_releases, key=lambda x: x["tagged_date"], reverse=True) + for release in parsed_releases: + version = f"v{release['version']!s}" + if latest_existing_version and version == latest_existing_version: + break + + tag_url = f"https://github.com/codegen-sh/codegen-sdk/releases/tag/{version}" + release_summary = generate_release_summary(client, release) + release_content = f""" + +### [{release_summary["description"]}]({tag_url}) +- {"\n- ".join(release_summary["bullet_points"])} + +""" + releases.append(release_content) + + return "\n".join(releases) diff --git a/uv.lock b/uv.lock index 907483b28..bb060bb93 100644 --- a/uv.lock +++ b/uv.lock @@ -156,6 +156,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 }, ] +[[package]] +name = "boto3" +version = "1.36.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/78/2bef75ba63337615b9582287b47bdf577890b153a090cd69af6d3b89fef0/boto3-1.36.14.tar.gz", hash = "sha256:4b0b8dd593b95f32a5a761dee65094423fbd06a4ad09f26b2e6c80493139569f", size = 111021 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/54/b78e82eba92b4cb9850887ea74974094209e4fe594d81e8fd4fb2fc9cba9/boto3-1.36.14-py3-none-any.whl", hash = "sha256:e2dab15944c3f517c88850d60b07f2f6fd3bc69aa51c47670e4f45d62a8c41fd", size = 139180 }, +] + +[[package]] +name = "botocore" +version = "1.36.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/e3/463a950de420536122744fc3798fd1d653453e6bb031ec3ffc5ca72dcd82/botocore-1.36.14.tar.gz", hash = "sha256:53feff270078c23ba852fb2638fde6c5f74084cfc019dd5433e865cd04065c60", size = 13498715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/0e/fda43b7e7e969f9450d86ec7825a1b6be6910b854d4fff4e1367ad58e0ca/botocore-1.36.14-py3-none-any.whl", hash = "sha256:546d0c071e9c8aeaca399d71bec414abe6434460f7d6640cbd92d4b1c3eb443e", size = 13331077 }, +] + [[package]] name = "bracex" version = "2.5.post1" @@ -337,6 +365,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, ] +[[package]] +name = "click-option-group" +version = "0.5.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/b8/91054601a2e05fd9060cb1baf56be5b24145817b059e078669e1099529c7/click-option-group-0.5.6.tar.gz", hash = "sha256:97d06703873518cc5038509443742b25069a3c7562d1ea72ff08bfadde1ce777", size = 16517 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/75/81ea958bc0f7e410257cb2a42531b93a7695a31930cde87192c010a52c50/click_option_group-0.5.6-py3-none-any.whl", hash = "sha256:38a26d963ee3ad93332ddf782f9259c5bdfe405e73408d943ef5e7d0c3767ec7", size = 12467 }, +] + [[package]] name = "codegen" source = { editable = "." } @@ -373,6 +413,7 @@ dependencies = [ { name = "pytest-snapshot" }, { name = "python-dotenv" }, { name = "python-levenshtein" }, + { name = "python-semantic-release" }, { name = "requests" }, { name = "rich" }, { name = "rich-click" }, @@ -419,9 +460,11 @@ dev = [ { name = "deptry" }, { name = "emoji" }, { name = "filelock" }, + { name = "httpx" }, { name = "inflection" }, { name = "isort" }, { name = "jsbeautifier" }, + { name = "keyrings-codeartifact" }, { name = "loguru" }, { name = "mypy", extra = ["faster-cache", "mypyc"] }, { name = "pre-commit" }, @@ -473,6 +516,7 @@ requires-dist = [ { name = "pytest-snapshot", specifier = ">=0.9.0" }, { name = "python-dotenv", specifier = ">=1.0.1" }, { name = "python-levenshtein", specifier = ">=0.25.1,<1.0.0" }, + { name = "python-semantic-release" }, { name = "requests", specifier = ">=2.32.3" }, { name = "rich", specifier = ">=13.7.1,<14.0.0" }, { name = "rich-click", specifier = ">=1.8.5" }, @@ -515,9 +559,11 @@ dev = [ { name = "deptry", specifier = ">=0.22.0" }, { name = "emoji", specifier = ">=2.14.0" }, { name = "filelock", specifier = ">=3.15.4,<4.0.0" }, + { name = "httpx", specifier = ">=0.25.1,<0.28.0" }, { name = "inflection", specifier = ">=0.5.1,<1.0.0" }, { name = "isort", specifier = ">=5.13.2" }, { name = "jsbeautifier", specifier = ">=1.15.1,<2.0.0" }, + { name = "keyrings-codeartifact", specifier = ">=1.3.3" }, { name = "loguru", specifier = ">=0.7.3" }, { name = "mypy", extras = ["mypyc", "faster-cache"], specifier = ">=1.13.0" }, { name = "pre-commit", specifier = ">=4.0.1" }, @@ -774,6 +820,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637", size = 36533 }, ] +[[package]] +name = "dotty-dict" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/ab/88d67f02024700b48cd8232579ad1316aa9df2272c63049c27cc094229d6/dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15", size = 7699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/91/e0d457ee03ec33d79ee2cd8d212debb1bc21dfb99728ae35efdb5832dc22/dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f", size = 7014 }, +] + [[package]] name = "editorconfig" version = "0.17.0" @@ -1000,17 +1055,18 @@ wheels = [ [[package]] name = "httpx" -version = "0.28.1" +version = "0.27.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, + { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +sdist = { url = "https://files.pythonhosted.org/packages/78/82/08f8c936781f67d9e6b9eeb8a0c8b4e406136ea4c3d1f89a5db71d42e0e6/httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2", size = 144189 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, + { url = "https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 }, ] [[package]] @@ -1070,6 +1126,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, ] +[[package]] +name = "importlib-resources" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, +] + [[package]] name = "inflect" version = "5.6.2" @@ -1106,6 +1171,48 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, ] +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777 }, +] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825 }, +] + +[[package]] +name = "jaraco-functools" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", size = 19159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", size = 10187 }, +] + +[[package]] +name = "jeepney" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", size = 106005 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", size = 48435 }, +] + [[package]] name = "jinja2" version = "3.1.5" @@ -1153,6 +1260,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/61/c80ef80ed8a0a21158e289ef70dac01e351d929a1c30cb0f49be60772547/jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566", size = 202374 }, ] +[[package]] +name = "jmespath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, +] + [[package]] name = "jsbeautifier" version = "1.15.1" @@ -1163,6 +1279,36 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/69/3e/dd37e1a7223247e3ef94714abf572415b89c4e121c4af48e9e4c392e2ca0/jsbeautifier-1.15.1.tar.gz", hash = "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24", size = 75606 } +[[package]] +name = "keyring" +version = "25.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085 }, +] + +[[package]] +name = "keyrings-codeartifact" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "keyring" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/e9/3efb931ec0f4f73362a12d1c15cc1d808ad21e384ed636f4e3278cf721b7/keyrings_codeartifact-1.3.3.tar.gz", hash = "sha256:9ab26cec8d95feebba1c0086c5bba116f00bdeb5449d52ce31df2037aeb5e5a5", size = 9306 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/7a/4c0ec41f92987ce3127aef93c0812cf9371b544568dbb4e0ff8ba490e995/keyrings.codeartifact-1.3.3-py3-none-any.whl", hash = "sha256:91cf4db572d5e668198a63bed49ba163b0aadf9b0217f6ba112e0f3d1fd78a62", size = 7240 }, +] + [[package]] name = "lazy-object-proxy" version = "1.10.0" @@ -1332,6 +1478,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/0e/a9943f90b4a8a6d3849b81a00a00d2db128d876365385af382a0e2caf191/mini_racer-0.12.4-py3-none-win_amd64.whl", hash = "sha256:9446e3bd6a4eb9fbedf1861326f7476080995a31c9b69308acef17e5b7ecaa1b", size = 13674040 }, ] +[[package]] +name = "more-itertools" +version = "10.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 }, +] + [[package]] name = "mypy" version = "1.14.1" @@ -1980,6 +2135,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", size = 46108 }, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + [[package]] name = "python-dotenv" version = "1.0.1" @@ -1989,6 +2156,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, ] +[[package]] +name = "python-gitlab" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, + { name = "requests-toolbelt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/ea/e2cde926d63526935c1df259177371a195089b631d67a577fe5c39fbc7e1/python_gitlab-4.13.0.tar.gz", hash = "sha256:576bfb0901faca0c6b2d1ff2592e02944a6ec3e086c3129fb43c2a0df56a1c67", size = 484996 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/5e/5fb4dcae9f5af5463c16952823d446ca449cce920efe8669871f600f0ab9/python_gitlab-4.13.0-py3-none-any.whl", hash = "sha256:8299a054fb571da16e1a8c1868fff01f34ac41ea1410c713a4647b3bbb2aa279", size = 145254 }, +] + [[package]] name = "python-levenshtein" version = "0.26.1" @@ -2010,6 +2190,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, ] +[[package]] +name = "python-semantic-release" +version = "9.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "click-option-group" }, + { name = "dotty-dict" }, + { name = "gitpython" }, + { name = "importlib-resources" }, + { name = "jinja2" }, + { name = "pydantic" }, + { name = "python-gitlab" }, + { name = "requests" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/b2/f79bae5c84035fb39720560f92e088762ce10b05d274cc25aa501e4966f7/python_semantic_release-9.18.0.tar.gz", hash = "sha256:bab1d5e2bb531e4002fdce72367dc8f9f80ef8f534e23f83edaaa9faec9c507f", size = 299191 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/39/d3c0c2d2168dff7bc496505891c01959a5c138d304b9661cf9b4b88c035a/python_semantic_release-9.18.0-py3-none-any.whl", hash = "sha256:4a0b93fa6d75c69f42d2429b41dff229e3bf1b4d90a368e4aa62039aaa7cecc6", size = 126449 }, +] + [[package]] name = "python-slugify" version = "8.0.4" @@ -2022,6 +2225,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, ] +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -2139,6 +2351,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + [[package]] name = "requirements-parser" version = "0.11.0" @@ -2255,6 +2479,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/79/9bdd52d2a33d468c81c1827de1b588080cb055d1d3561b194ab7bf2635b5/rustworkx-0.16.0-cp39-abi3-win_amd64.whl", hash = "sha256:905df608843c32fa45ac023687769fe13056edf7584474c801d5c50705d76e9b", size = 1953559 }, ] +[[package]] +name = "s3transfer" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/45/2323b5928f86fd29f9afdcef4659f68fa73eaa5356912b774227f5cf46b5/s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f", size = 147885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/ac/e7dc469e49048dc57f62e0c555d2ee3117fa30813d2a1a2962cce3a2a82a/s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc", size = 84151 }, +] + +[[package]] +name = "secretstorage" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221 }, +] + [[package]] name = "sentry-sdk" version = "2.20.0"