diff --git a/patchwork/app.py b/patchwork/app.py index 4149959a6..61a6b8fe3 100644 --- a/patchwork/app.py +++ b/patchwork/app.py @@ -59,7 +59,13 @@ def list_option_callback(ctx: click.Context, param: click.Parameter, value: str def find_patchflow(possible_module_paths: Iterable[str], patchflow: str) -> Any | None: + whitelisted_modules = {"allowed_module1", "allowed_module2"} # Adjust whitelist as necessary + for module_path in possible_module_paths: + if module_path not in whitelisted_modules: + logger.debug(f"Module path {module_path} is not whitelisted.") + continue + try: spec = importlib.util.spec_from_file_location("custom_module", module_path) module = importlib.util.module_from_spec(spec) diff --git a/patchwork/common/tools/bash_tool.py b/patchwork/common/tools/bash_tool.py index 8440f179a..f88b2fcb6 100644 --- a/patchwork/common/tools/bash_tool.py +++ b/patchwork/common/tools/bash_tool.py @@ -2,12 +2,12 @@ import subprocess from pathlib import Path +import shlex from typing_extensions import Optional from patchwork.common.tools.tool import Tool - class BashTool(Tool, tool_name="bash"): def __init__(self, path: Path): super().__init__() @@ -45,10 +45,11 @@ def execute( try: result = subprocess.run( - command, shell=True, cwd=self.path, capture_output=True, text=True, timeout=60 # Add timeout for safety + shlex.split(command), shell=False, cwd=self.path, capture_output=True, text=True, timeout=60 # Add timeout for safety ) return result.stdout if result.returncode == 0 else f"Error: {result.stderr}" except subprocess.TimeoutExpired: return "Error: Command timed out after 60 seconds" except Exception as e: return f"Error: {str(e)}" + diff --git a/patchwork/common/tools/csvkit_tool.py b/patchwork/common/tools/csvkit_tool.py index a1ef8dc59..5d905022f 100644 --- a/patchwork/common/tools/csvkit_tool.py +++ b/patchwork/common/tools/csvkit_tool.py @@ -118,8 +118,9 @@ def execute(self, files: list[str], query: str) -> str: if db_path.is_file(): with sqlite3.connect(str(db_path)) as conn: for file in files: + table_name = file.removesuffix('.csv') res = conn.execute( - f"SELECT 1 from {file.removesuffix('.csv')}", + "SELECT 1 FROM ?", (table_name,) ) if res.fetchone() is None: files_to_insert.append(file) diff --git a/patchwork/common/utils/dependency.py b/patchwork/common/utils/dependency.py index 27b89bfed..f6e9cf68f 100644 --- a/patchwork/common/utils/dependency.py +++ b/patchwork/common/utils/dependency.py @@ -6,9 +6,13 @@ "notification": ["slack_sdk"], } +ALLOWED_MODULES = {"semgrep", "depscan", "slack_sdk"} @lru_cache(maxsize=None) def import_with_dependency_group(name): + if name not in ALLOWED_MODULES: + raise ImportError(f"Module {name} is not whitelisted for import.") + try: return importlib.import_module(name) except ImportError: diff --git a/patchwork/common/utils/step_typing.py b/patchwork/common/utils/step_typing.py index d349f7fc1..008f67e34 100644 --- a/patchwork/common/utils/step_typing.py +++ b/patchwork/common/utils/step_typing.py @@ -108,7 +108,15 @@ def validate_step_type_config_with_inputs( def validate_step_with_inputs(input_keys: Set[str], step: Type[Step]) -> Tuple[Set[str], Dict[str, str]]: module_path, _, _ = step.__module__.rpartition(".") step_name = step.__name__ - type_module = importlib.import_module(f"{module_path}.typed") + + # Whitelist of allowed modules + allowed_modules = {"allowed_module1.typed", "allowed_module2.typed"} + full_module_path = f"{module_path}.typed" + + if full_module_path not in allowed_modules: + raise ImportError(f"Attempt to import disallowed module {full_module_path}") + + type_module = importlib.import_module(full_module_path) step_input_model = getattr(type_module, f"{step_name}Inputs", __NOT_GIVEN) step_output_model = getattr(type_module, f"{step_name}Outputs", __NOT_GIVEN) if step_input_model is __NOT_GIVEN: diff --git a/patchwork/steps/AgenticLLMV2/AgenticLLMV2.py b/patchwork/steps/AgenticLLMV2/AgenticLLMV2.py index da781d0f2..a6abd04e6 100644 --- a/patchwork/steps/AgenticLLMV2/AgenticLLMV2.py +++ b/patchwork/steps/AgenticLLMV2/AgenticLLMV2.py @@ -18,7 +18,7 @@ def __init__(self, inputs): base_path = str(Path.cwd()) self.conversation_limit = int(inputs.get("max_agent_calls", 1)) self.agentic_strategy = AgenticStrategyV2( - model="claude-3-5-sonnet-latest", + model=inputs.get("strategy_model", "claude-3-5-sonnet-latest"), llm_client=AioLlmClient.create_aio_client(inputs), template_data=inputs.get("prompt_value", {}), system_prompt_template=inputs.get("system_prompt", "Summarise from our previous conversation"), @@ -26,7 +26,7 @@ def __init__(self, inputs): agent_configs=[ AgentConfig( name="Assistant", - model="claude-3-7-sonnet-latest", + model=inputs.get("agent_model", "claude-3-7-sonnet-latest"), tool_set=Tool.get_tools(path=base_path), system_prompt=inputs.get("agent_system_prompt"), ) diff --git a/patchwork/steps/AgenticLLMV2/typed.py b/patchwork/steps/AgenticLLMV2/typed.py index 0cdd56c3c..519100ff8 100644 --- a/patchwork/steps/AgenticLLMV2/typed.py +++ b/patchwork/steps/AgenticLLMV2/typed.py @@ -9,9 +9,32 @@ class AgenticLLMV2Inputs(TypedDict, total=False): system_prompt: str user_prompt: str max_agent_calls: Annotated[int, StepTypeConfig(is_config=True)] - anthropic_api_key: str + strategy_model: str + agent_model: str agent_system_prompt: str example_json: str + openai_api_key: Annotated[ + str, + StepTypeConfig( + is_config=True, or_op=["patched_api_key", "google_api_key", "client_is_gcp", "anthropic_api_key"] + ), + ] + anthropic_api_key: Annotated[ + str, + StepTypeConfig(is_config=True, or_op=["patched_api_key", "google_api_key", "client_is_gcp", "openai_api_key"]), + ] + google_api_key: Annotated[ + str, + StepTypeConfig( + is_config=True, or_op=["patched_api_key", "openai_api_key", "client_is_gcp", "anthropic_api_key"] + ), + ] + client_is_gcp: Annotated[ + str, + StepTypeConfig( + is_config=True, or_op=["patched_api_key", "openai_api_key", "anthropic_api_key", "google_api_key"] + ), + ] class AgenticLLMV2Outputs(TypedDict): diff --git a/patchwork/steps/CallShell/CallShell.py b/patchwork/steps/CallShell/CallShell.py index 98ee55a74..ac3a9b323 100644 --- a/patchwork/steps/CallShell/CallShell.py +++ b/patchwork/steps/CallShell/CallShell.py @@ -46,7 +46,8 @@ def __parse_env_text(env_text: str) -> dict[str, str]: return env def run(self) -> dict: - p = subprocess.run(self.script, shell=True, capture_output=True, text=True, cwd=self.working_dir, env=self.env) + args = shlex.split(self.script) + p = subprocess.run(args, shell=False, capture_output=True, text=True, cwd=self.working_dir, env=self.env) try: p.check_returncode() except subprocess.CalledProcessError as e: @@ -57,3 +58,4 @@ def run(self) -> dict: logger.info(f"stdout: \n{p.stdout}") logger.info(f"stderr:\n{p.stderr}") return dict(stdout_output=p.stdout, stderr_output=p.stderr) + diff --git a/patchwork/steps/GitHubAgent/GitHubAgent.py b/patchwork/steps/GitHubAgent/GitHubAgent.py index 4fe3125ce..e431cfd70 100644 --- a/patchwork/steps/GitHubAgent/GitHubAgent.py +++ b/patchwork/steps/GitHubAgent/GitHubAgent.py @@ -21,7 +21,7 @@ def __init__(self, inputs): model="claude-3-5-sonnet-latest", llm_client=AioLlmClient.create_aio_client(inputs), template_data=dict(), - system_prompt_template=f"""\ + system_prompt_template="""\ Please summarise the conversation given and provide the result in the structure that is asked of you. """, user_prompt_template=f"""\ @@ -34,15 +34,17 @@ def __init__(self, inputs): AgentConfig( name="Assistant", model="gemini-2.0-flash", - tool_set=dict(github_tool=GitHubTool(base_path, inputs["github_api_token"])), + tool_set=dict(github_tool=GitHubTool(base_path, inputs["github_api_key"])), system_prompt="""\ -You are a senior software developer helping the program manager to obtain some data from GitHub. -You can access github through the `gh` CLI app. +You are a senior software developer helping the program manager to obtain some data from GitHub. +You can access github through the `gh` CLI app. Your `gh` app has already been authenticated. """, ) ], - example_json=inputs.get("example_json"), + example_json=inputs.get( + "example_json", '{"summary_of_actions": "1. Retrieved the list of repositories. 2. ..."}' + ), ) def run(self) -> dict: diff --git a/patchwork/steps/GitHubAgent/typed.py b/patchwork/steps/GitHubAgent/typed.py index b54b132de..a338dddfd 100644 --- a/patchwork/steps/GitHubAgent/typed.py +++ b/patchwork/steps/GitHubAgent/typed.py @@ -1,9 +1,10 @@ -from typing_extensions import Annotated, Any, Dict, TypedDict +from typing_extensions import Annotated, Any, Dict, Optional, TypedDict from patchwork.common.utils.step_typing import StepTypeConfig class __GitHubAgentRequiredInputs(TypedDict): + github_api_key: str task: str @@ -11,6 +12,7 @@ class GitHubAgentInputs(__GitHubAgentRequiredInputs, total=False): base_path: str prompt_value: Dict[str, Any] max_llm_calls: Annotated[int, StepTypeConfig(is_config=True)] + example_json: str openai_api_key: Annotated[ str, StepTypeConfig( diff --git a/poetry.lock b/poetry.lock index 647f9e91e..329e5c47e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "agate" @@ -348,7 +348,7 @@ description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -586,8 +586,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -784,7 +784,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {dev = "(sys_platform == \"linux\" or sys_platform == \"darwin\") and platform_python_implementation != \"PyPy\" or sys_platform == \"darwin\""} +markers = {dev = "(sys_platform == \"linux\" or sys_platform == \"darwin\") and (platform_python_implementation != \"PyPy\" or sys_platform == \"darwin\")"} [package.dependencies] pycparser = "*" @@ -1069,7 +1069,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "python_version < \"3.10\"", dev = "python_version < \"3.10\" and sys_platform == \"linux\""} +markers = {main = "python_version == \"3.9\"", dev = "python_version == \"3.9\" and sys_platform == \"linux\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1242,7 +1242,7 @@ description = "XML bomb protection for Python stdlib modules" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main"] -markers = "(extra == \"security\" or extra == \"all\" or extra == \"browser-use\") and (extra == \"security\" or extra == \"all\" or python_version >= \"3.11\")" +markers = "python_version >= \"3.11\" and (extra == \"security\" or extra == \"all\" or extra == \"browser-use\") or extra == \"security\" or extra == \"all\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -1478,7 +1478,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version <= \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1849,8 +1849,8 @@ files = [ google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = [ - {version = ">=1.22.3,<2.0.0dev"}, {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""}, + {version = ">=1.22.3,<2.0.0dev"}, ] protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" @@ -1870,16 +1870,16 @@ files = [ google-auth = ">=2.14.1,<3.0.0" googleapis-common-protos = ">=1.56.2,<2.0.0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, ] proto-plus = [ - {version = ">=1.22.3,<2.0.0"}, {version = ">=1.25.0,<2.0.0", markers = "python_version >= \"3.13\""}, + {version = ">=1.22.3,<2.0.0"}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" requests = ">=2.18.0,<3.0.0" @@ -2035,8 +2035,8 @@ google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extr google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" grpc-google-iam-v1 = ">=0.14.0,<1.0.0dev" proto-plus = [ - {version = ">=1.22.3,<2.0.0dev"}, {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""}, + {version = ">=1.22.3,<2.0.0dev"}, ] protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" @@ -2170,7 +2170,7 @@ description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") or extra == \"browser-use\" or extra == \"all\"" +markers = "(platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") and python_version <= \"3.13\" or extra == \"browser-use\" or extra == \"all\"" files = [ {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, @@ -2589,7 +2589,7 @@ files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, ] -markers = {dev = "python_version < \"3.12\""} +markers = {dev = "python_version <= \"3.11\""} [package.dependencies] zipp = ">=3.20" @@ -2973,7 +2973,7 @@ description = "An integration package connecting AnthropicMessages and LangChain optional = true python-versions = "<4.0,>=3.9" groups = ["main"] -markers = "python_version <= \"3.10\" and (extra == \"browser-use\" or extra == \"all\")" +markers = "(extra == \"browser-use\" or extra == \"all\") and python_version < \"3.11\"" files = [ {file = "langchain_anthropic-0.3.9-py3-none-any.whl", hash = "sha256:adbbfaf3ce9798d46fb43d6fc01105630238f375dc6043d35d0aafab61fdbb71"}, {file = "langchain_anthropic-0.3.9.tar.gz", hash = "sha256:e8012d7986ad1d8412df6914c56f3c0d2797f231766a03bb1ad22cc7023e6e1d"}, @@ -3002,8 +3002,8 @@ jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.125,<0.4" packaging = ">=23.2,<25" pydantic = [ - {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, + {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, ] PyYAML = ">=5.3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" @@ -3070,7 +3070,7 @@ description = "An integration package connecting OpenAI and LangChain" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] -markers = "python_version <= \"3.10\" and (extra == \"browser-use\" or extra == \"all\")" +markers = "(extra == \"browser-use\" or extra == \"all\") and python_version < \"3.11\"" files = [ {file = "langchain_openai-0.3.8-py3-none-any.whl", hash = "sha256:9004dc8ef853aece0d8f0feca7753dc97f710fa3e53874c8db66466520436dbb"}, {file = "langchain_openai-0.3.8.tar.gz", hash = "sha256:4d73727eda8102d1d07a2ca036278fccab0bb5e0abf353cec9c3973eb72550ec"}, @@ -3099,8 +3099,8 @@ httpx = ">=0.23.0,<1" orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""} packaging = ">=23.2" pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, ] requests = ">=2,<3" requests-toolbelt = ">=1.0.0,<2.0.0" @@ -3836,7 +3836,7 @@ description = "Fast, correct Python JSON library supporting dataclasses, datetim optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"browser-use\" or extra == \"all\" or extra == \"security\") and platform_python_implementation != \"PyPy\" or (extra == \"browser-use\" or extra == \"all\" or extra == \"security\") and (extra == \"security\" or extra == \"all\")" +markers = "(extra == \"browser-use\" or extra == \"all\" or extra == \"security\") and (platform_python_implementation != \"PyPy\" or extra == \"security\" or extra == \"all\")" files = [ {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"}, {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"}, @@ -4033,9 +4033,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4746,7 +4746,7 @@ files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {dev = "(sys_platform == \"linux\" or sys_platform == \"darwin\") and platform_python_implementation != \"PyPy\" or sys_platform == \"darwin\""} +markers = {dev = "(sys_platform == \"linux\" or sys_platform == \"darwin\") and (platform_python_implementation != \"PyPy\" or sys_platform == \"darwin\")"} [[package]] name = "pydantic" @@ -5851,7 +5851,7 @@ description = "C version of reader, parser and emitter for ruamel.yaml derived f optional = true python-versions = ">=3.9" groups = ["main"] -markers = "platform_python_implementation == \"CPython\" and python_version <= \"3.12\" and (extra == \"security\" or extra == \"all\")" +markers = "(extra == \"security\" or extra == \"all\") and platform_python_implementation == \"CPython\" and python_version < \"3.13\"" files = [ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, @@ -6360,7 +6360,7 @@ description = "backport of asyncio.TaskGroup, asyncio.Runner and asyncio.timeout optional = true python-versions = "*" groups = ["main"] -markers = "(extra == \"security\" or extra == \"all\") and python_version <= \"3.10\"" +markers = "(extra == \"security\" or extra == \"all\") and python_version < \"3.11\"" files = [ {file = "taskgroup-0.2.2-py2.py3-none-any.whl", hash = "sha256:e2c53121609f4ae97303e9ea1524304b4de6faf9eb2c9280c7f87976479a52fb"}, {file = "taskgroup-0.2.2.tar.gz", hash = "sha256:078483ac3e78f2e3f973e2edbf6941374fbea81b9c5d0a96f51d297717f4752d"}, @@ -7378,7 +7378,7 @@ files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] -markers = {dev = "python_version < \"3.12\""} +markers = {dev = "python_version <= \"3.11\""} [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] diff --git a/pyproject.toml b/pyproject.toml index 2b232bf6f..b5ee43dc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "patchwork-cli" -version = "0.0.121" +version = "0.0.122" description = "" authors = ["patched.codes"] license = "AGPL"