From 17c35a5e0c5855f909efc70c84da8238ee4eb4aa Mon Sep 17 00:00:00 2001 From: eneumann Date: Fri, 6 Feb 2026 17:55:11 -0800 Subject: [PATCH] EN [#5917] Support async parsing; fix pyproject schema; require deployable types --- polyapi/deployables.py | 3 ++- polyapi/parser.py | 16 +++++++++++++--- pyproject.toml | 10 ++++------ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/polyapi/deployables.py b/polyapi/deployables.py index fc0a6f3..6c1a08d 100644 --- a/polyapi/deployables.py +++ b/polyapi/deployables.py @@ -6,6 +6,7 @@ import hashlib from pathlib import Path from typing import TypedDict, List, Dict, Tuple, Optional, Any, Union +from typing_extensions import Required from subprocess import check_output, CalledProcessError @@ -54,7 +55,7 @@ class DeployableRecord(ParsedDeployableConfig, total=False): gitRevision: str fileRevision: str file: str - types: DeployableFunctionTypes + types: Required[DeployableFunctionTypes] typeSchemas: Dict[str, Any] dependencies: List[str] deployments: List[Deployment] diff --git a/polyapi/parser.py b/polyapi/parser.py index 1485202..3426fd3 100644 --- a/polyapi/parser.py +++ b/polyapi/parser.py @@ -3,7 +3,7 @@ import types import sys import re -from typing import Dict, List, Mapping, Optional, Tuple, Any +from typing import Dict, List, Mapping, Optional, Tuple, Any, Union from typing import _TypedDictMeta as BaseTypedDict # type: ignore from typing_extensions import _TypedDictMeta, cast # type: ignore from stdlib_list import stdlib_list @@ -390,7 +390,7 @@ def visit_AnnAssign(self, node): deployable["config"] = _parse_dict(node.value) self._name = deployable["config"]["name"] - def _extract_docstring_from_function(self, node: ast.FunctionDef): + def _extract_docstring_from_function(self, node: Union[ast.FunctionDef, ast.AsyncFunctionDef]): start_lineno = (node.body[0].lineno if node.body else node.lineno) - 1 start_offset = self._line_offsets[start_lineno] end_offset = start_offset @@ -452,15 +452,19 @@ def visit_Import(self, node: ast.Import): for name in node.names: req = _get_req_name_if_not_in_base(name.name, pip_name_lookup) if req: + if "dependencies" not in deployable or deployable["dependencies"] is None: + deployable["dependencies"] = [] deployable["dependencies"].append(req) def visit_ImportFrom(self, node: ast.ImportFrom): if node.module: req = _get_req_name_if_not_in_base(node.module, pip_name_lookup) if req: + if "dependencies" not in deployable or deployable["dependencies"] is None: + deployable["dependencies"] = [] deployable["dependencies"].append(req) - def visit_FunctionDef(self, node: ast.FunctionDef): + def _handle_function_def(self, node: Union[ast.FunctionDef, ast.AsyncFunctionDef]): if node.name == self._name: # Parse docstring which may contain param types and descriptions self._extract_docstring_from_function(node) @@ -506,6 +510,12 @@ def visit_FunctionDef(self, node: ast.FunctionDef): else: deployable["types"]["returns"]["type"] = "Any" + def visit_FunctionDef(self, node: ast.FunctionDef): + self._handle_function_def(node) + + def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef): + self._handle_function_def(node) + def generic_visit(self, node): if hasattr(node, 'lineno') and hasattr(node, 'col_offset'): self._current_offset = self._line_offsets[node.lineno - 1] + node.col_offset diff --git a/pyproject.toml b/pyproject.toml index 8dc916b..5f4799a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,10 @@ [build-system] requires = ["setuptools>=61.2", "wheel"] +build-backend = "setuptools.build_meta" [project] name = "polyapi-python" -version = "0.3.12" +version = "0.3.13.dev1" description = "The Python Client for PolyAPI, the IPaaS by Developers for Developers" authors = [{ name = "Dan Fellin", email = "dan@polyapi.io" }] dependencies = [ @@ -23,14 +24,11 @@ requires-python = ">=3.10" [project.urls] Homepage = "https://github.com/polyapi/polyapi-python" -[tool.setuptools] -packages = ["polyapi"] - -[tools.setuptools.packages.find] +[tool.setuptools.packages.find] include = ["polyapi"] exclude = ["polyapi/poly*", "polyapi/vari*", "polyapi/.config.env", "polyapi/cached_deployables*", "polyapi/deployments_revision"] # exclude the generated libraries from builds [tool.mypy] # for now redef errors happen sometimes, we will clean this up in the future! disable_error_code = "no-redef,name-defined" -implicit_optional = true +implicit_optional = true \ No newline at end of file