Skip to content

Commit 123e2c3

Browse files
aarongoinsudiptatjeuphariseneumanndchiniquy
authored
R26 (#86)
* # Feature (2970): Update python client to support setup command (#22) * # Feature (2970): Update python client to support setup command - Function add command now support --execution-api-key - Extra Old Function call removed * improve polyapi-python setup (#24) * improve polyapi-python setup * # Feature (3019): improve polyapi-python setup (#25) * # Feature (3019): improve polyapi-python setup * # Feature (3019): improve polyapi-python setup - UUID Validation check added --------- Co-authored-by: Sudipta at TechJays <[email protected]> * # Feature (3007): Update python -m polyapi function add --logs options (#23) * # Feature (3007): Update python -m polyapi function add --logs options - if --logs added, then value must enabled or disabled - If Nothing passed the value is default disabled - pyproject.toml version updated * Project Glide + Refactor main command line args parsing (#26) * Refactor main command line args parsing, adding prepare and sync commands to enable project glide workflows for python * improved tests * updating version * fix for poly cache directory path construction * one more adjustment to the deployables cache directory so there can't be any conflict with any custom namespace * this better? * verbose logging on upload code to see what's failing in CI/CD * bumpity * whoops * so close * better? * okay this should be the fix * is it this? * maybe * oh for the love of pete * whatever. might be a pypi issue * removing verbose logging * fixing bugs in sync command to use correct api urls * update logging * lint * improved auth * last fix for function sync * fix bug when comment arguments don't align with the function * try forcing the poly directory to exist * test logging * remove debug logging * fixing project glide deployable types and bumping the version * fixing missing arguments in python client function upload * fixing return type for trained functions * fix bug preventing use of poly sync command locally * next version of client! * EN #3183 allow null logs flag for python client (#28) * let the typing_extensions versions increase to support latest openai pypi package version * update dependency in one more place * Some bug fixes for python client (#29) * fixed bug with parsing python functions without any types, and bug where functions with multiple deployment receipts were getting mangled * whoops. uncommenting tests * last test fix * 0.3.2 * add poly schemas support (#31) * onward * adding schemas for Pythonland! * onward * next * next * next * next * test * next * next * next * little tweak for A-Aron * fix * next * update to v4 * v4 everywhere * bump version * add new version * remove warning, just go with any type for now * better generate printed messages, fix generate bug after function add * Update python version (#32) * Update python image (#33) * Update python version * Updated version * Rollback version * onward (#34) * woot! we have some better return types * toward working tests - except parser/deployables * more * getting there * next * onawrd * next * next * next * next * next (#35) * improve intellisense detection of schemas * release 0.3.3.dev8, fix misleading generate after setup * 0.3.3.dev9 - add support for optional arguments (#36) * next * release 0.3.3.dev10 * EN #3943 update to support SFX serverSideAsync True by setting correct return type (#39) * deploying version 0.3.3 for R22 * upgrade version * 4084 - revert strippping none values from function arguments during execution * P2) Update clients and specs endpoint so when generating with no-types argument all schemas get excluded (#38) * added no type option * version updated * 4010 generate contexts (#43) * make contexts truly optional * P3) (Optoro) Allow variable to be secret in the UI, but gettable in functions, and prevent secret variables from being made non-secret (#42) * secret -> secrecy - updated python client * comment fixed * add generate contexts (#45) * adds mtls and direct execute options (#44) * adds mtls and direct execute support * support for direct execute from client * fixed mtls * removed unused dep * polyCustom - prevent rewrites of executionId (#46) * 4292 (#47) * create mock schemas to fit everything when using no types flag (#48) * EN #4348 flatten new-lines in arg descriptions (#50) * EN #4348 flatten new-lines in arg descriptions * EN #4348 bump version to 0.3.7.dev4 * EN #4360 fix return types for TS funcs (#49) * adding ability for python client server and client functions to add custom headers (#51) * fix type error! * try simple upgrade * changed version * 0.3.8.dev0 make it clearer that jsonschema parsing issue is warning not error * 4418 p2 bug on glide pre commit hook poly prepare make sure we git add any docstrings added from poly prepare (#55) * Fixed windows no deployables found bug * removed superfluous print * Fixed deployables not being staged properly * Added .venv to excluded directories * Bumped version up to 0.3.8.dev1 * 4523 fix python client to save generate command arguments and reuse them (#53) * Add caching for all arguments, add names and function-ids arguments * Fix restrictiveness logic to work on all arguments * Only use cache when indirectly generated * initialize cache with generate * initialize cache to generate * Update toml and config * Restore Generating... print message --------- Co-authored-by: Ashir Rao <[email protected]> * Update pydantic version to work with Python 3.13 (#54) * fix vari under no types (#56) * better import error (#59) * 4645 Add github action for polyapi-python unittests, fix polyapi-python unittests (#57) * make tests pass and github actions * comment + push * add dev_requirements * use dev requirements * using mkdir to avoid poly not existing * Revert deployables anf change whitespace for passing tests * undo diff * undo deployables.py change * Windows glide bug (#61) * Fixed windows find deployable command and fixed ai description generation urls * Changed version number * version command in python (#58) * version command in python * P2) Webhook Payload Type Blows Up our Python Client (#62) * adds a fail safe when generating resources * version increase * version increment * Fixing bug where users couldn't put a description in their polyConfig… (#60) * Fixing bug where users couldn't put a description in their polyConfig field for glide functions * removing test_bash which should not have been commited, and bumping the version * next * fix schema generation (#64) * remove bad ci file * Upgrading version to 0.3.8 (#67) * 4655 p3 polyapi python schema errors lets fix (#63) * Changed encoding to utf-8 and added unit test * changed version * Updated version * Fixed find deployables command to ensure there are no duplicates (#65) * Fixed find deployables command to ensure there are no duplicates * Updated version * Updated version * Added check for LOGS_ENABLED env var and updated exceptions (#70) * Added check for LOGS_ENABLED env var and updated exceptions * Bumped version * allow higher stdlib_list * update in one more spot * increase version of truststore installed * added logger (#72) * added logger * bumped version * Change print to use logging (#73) * Monkey patched print to use logging module * Bumped version * EN #4845 fix function args schema bug for TypedDicts * Revert c612f6e (EN #4845 fix function args schema bug for TypedDicts) – accidental push * EN bump v to 0.3.9.dev8 * EN #4845 fix func arg schema bug with typed dicts (#75) * EN #4845 fix func arg schema bug with typed dicts * EN #4845 v0.3.9.dev9 * Tabi sdk (#74) * fixing client_id to be singe shared value per generation--matching typescript behavior * fixing some little type errors * tabi in the house! * tweaked to make table_id available on class, and adding description as a docstring comment for the class * bump version * oh lordy (#76) * One more missed f-string in tabi * Revert monkey patch (#77) * Revert "Monkey patched print to use logging module" This reverts commit a761c64. * bumped version * remove need for special logging process * fix GitHub action for polyapi python unittests, fix polyapi python unittests (#66) * make tests pass and github actions * comment + push * add dev_requirements * use dev requirements * using mkdir to avoid poly not existing * Revert deployables anf change whitespace for passing tests * undo diff * undo deployables.py change * new python-ci with pytest, correct actions syntax * add flask to the requirements, needed for a test * running into weird ord bug in python3.11, lets do simpler 7 char hash (#79) * running into weird ord bug in python3.11, lets do simpler 7 char hash * bump * fix tests * add workflow dispatch * try under 3.13 * 0.3.9.dev15: define some sort of scrub_keys * back up * actually fix tests * Revert "actually fix tests" This reverts commit 87caa04. * in sync with actions now? * update version for deploy * Updated encoding to utf-8 (#82) * Updated encoding to utf-8 * bumped version * EN #4926 fix parser to include kwargs when parsing function params (#83) * EN #4926 Disallow keyword only args (#84) * 4940 add visibility argument (#81) * Added visibility argument * bumped version * bumped version * Implemented scrub_keys function (#85) * Implemented scrub_keys function * bumped version * fix python * Prepare for deploy --------- Co-authored-by: Sudipta at TechJays <[email protected]> Co-authored-by: Dan Fellin <[email protected]> Co-authored-by: Dan Fellin <[email protected]> Co-authored-by: Eric Neumann <[email protected]> Co-authored-by: Don Chiniquy <[email protected]> Co-authored-by: nahuel-polyapi <[email protected]> Co-authored-by: Bboydozzy96 <[email protected]> Co-authored-by: FedeMarchiniHotovo <[email protected]> Co-authored-by: Shina Akinboboye <[email protected]> Co-authored-by: Richard <[email protected]> Co-authored-by: Shina Akinboboye <[email protected]> Co-authored-by: Daniel-Estoll <[email protected]> Co-authored-by: Ashir Rao <[email protected]> Co-authored-by: Ashir Rao <[email protected]> Co-authored-by: eric.neumann <[email protected]>
1 parent 8076d85 commit 123e2c3

File tree

7 files changed

+36
-8
lines changed

7 files changed

+36
-8
lines changed

polyapi/cli.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,13 @@ def generate_command(args):
113113
fn_add_parser.add_argument("--execution-api-key", required=False, default="", help="API key for execution (for server functions only).")
114114
fn_add_parser.add_argument("--disable-ai", "--skip-generate", action="store_true", help="Pass --disable-ai skip AI generation of missing descriptions")
115115
fn_add_parser.add_argument("--generate-contexts", type=str, help="Server function only – only include certain contexts to speed up function execution")
116+
fn_add_parser.add_argument("--visibility", type=str, default="environment", help="Specifies the visibility of a function. Options: PUBLIC, TENANT, ENVIRONMENT. Case insensitive")
116117

117118
def add_function(args):
118119
initialize_config()
119120
logs_enabled = args.logs == "enabled" if args.logs else None
120121
err = ""
122+
visibility = args.visibility.upper()
121123
if args.server and args.client:
122124
err = "Specify either `--server` or `--client`. Found both."
123125
elif not args.server and not args.client:
@@ -126,6 +128,8 @@ def add_function(args):
126128
err = "Option `logs` is only for server functions (--server)."
127129
elif args.generate_contexts and not args.server:
128130
err = "Option `generate-contexts` is only for server functions (--server)."
131+
elif visibility not in ["PUBLIC", "TENANT", "ENVIRONMENT"]:
132+
err = "Invalid visiblity argument, visibility must be one of ['PUBLIC', 'TENANT', 'ENVIRONMENT']"
129133

130134
if err:
131135
print_red("ERROR")
@@ -142,7 +146,8 @@ def add_function(args):
142146
logs_enabled=logs_enabled,
143147
generate=not args.disable_ai,
144148
execution_api_key=args.execution_api_key,
145-
generate_contexts=args.generate_contexts
149+
generate_contexts=args.generate_contexts,
150+
visibility=visibility
146151
)
147152

148153
fn_add_parser.set_defaults(command=add_function)

polyapi/function_cli.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def function_add_or_update(
2525
server: bool,
2626
logs_enabled: Optional[bool],
2727
generate_contexts: Optional[str],
28+
visibility: Optional[str],
2829
generate: bool = True,
2930
execution_api_key: str = ""
3031
):
@@ -55,6 +56,7 @@ def function_add_or_update(
5556
"description": description or parsed["types"]["description"],
5657
"code": code,
5758
"language": "python",
59+
"visibility": visibility or "ENVIRONMENT",
5860
"returnType": get_jsonschema_type(return_type),
5961
"arguments": [{**p, "key": p["name"], "type": get_jsonschema_type(p["type"])} for p in parsed["types"]["params"]],
6062
"logsEnabled": logs_enabled,

polyapi/generate.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,20 +503,20 @@ def add_function_file(
503503
# Read current __init__.py content if it exists
504504
init_content = ""
505505
if os.path.exists(init_path):
506-
with open(init_path, "r") as f:
506+
with open(init_path, "r", encoding='utf-8') as f:
507507
init_content = f.read()
508508

509509
# Prepare new content to append to __init__.py
510510
new_init_content = init_content + f"\n\nfrom . import {func_namespace}\n\n{func_str}"
511511

512512
# Use temporary files for atomic writes
513513
# Write to __init__.py atomically
514-
with tempfile.NamedTemporaryFile(mode="w", delete=False, dir=full_path, suffix=".tmp") as temp_init:
514+
with tempfile.NamedTemporaryFile(mode="w", delete=False, dir=full_path, suffix=".tmp", encoding='utf-8') as temp_init:
515515
temp_init.write(new_init_content)
516516
temp_init_path = temp_init.name
517517

518518
# Write to function file atomically
519-
with tempfile.NamedTemporaryFile(mode="w", delete=False, dir=full_path, suffix=".tmp") as temp_func:
519+
with tempfile.NamedTemporaryFile(mode="w", delete=False, dir=full_path, suffix=".tmp", encoding='utf-8') as temp_func:
520520
temp_func.write(func_type_defs)
521521
temp_func_path = temp_func.name
522522

polyapi/parser.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,12 @@ def visit_FunctionDef(self, node: ast.FunctionDef):
464464
if node.name == self._name:
465465
# Parse docstring which may contain param types and descriptions
466466
self._extract_docstring_from_function(node)
467+
468+
if node.args.kwonlyargs:
469+
print_red("ERROR")
470+
print("Function signature has keyword-only arguments (after `*`). Please use only positional arguments.")
471+
sys.exit(1)
472+
467473
function_args = [arg for arg in node.args.args]
468474
docstring_params = deployable["types"]["params"]
469475
parsed_params = []

polyapi/poly_tables.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,21 @@
66
from polyapi.typedefs import TableSpecDto
77
from polyapi.constants import JSONSCHEMA_TO_PYTHON_TYPE_MAP
88

9+
def scrub(data) -> Dict[str, Any]:
10+
if (not data or not isinstance(data, (Dict, List))): return data
11+
if isinstance(data, List):
12+
return [scrub(item) for item in data]
13+
else:
14+
temp = {}
15+
secrets = ["x_api_key", "x-api-key", "access_token", "access-token", "authorization", "api_key", "api-key", "apikey", "accesstoken", "token", "password", "key"]
16+
for key, value in data.items():
17+
if isinstance(value, (Dict, List)):
18+
temp[key] = scrub(data[key])
19+
elif key.lower() in secrets:
20+
temp[key] = '********'
21+
else:
22+
temp[key] = data[key]
23+
return temp
924

1025
def scrub_keys(e: Exception) -> Dict[str, Any]:
1126
"""
@@ -16,7 +31,7 @@ def scrub_keys(e: Exception) -> Dict[str, Any]:
1631
"error": str(e),
1732
"type": type(e).__name__,
1833
"message": str(e),
19-
"args": getattr(e, 'args', None)
34+
"args": scrub(getattr(e, 'args', None))
2035
}
2136

2237

polyapi/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def init_the_init(full_path: str, code_imports: Optional[str] = None) -> None:
2424
if not os.path.exists(init_path):
2525
if code_imports is None:
2626
code_imports = CODE_IMPORTS
27-
with open(init_path, "w") as f:
27+
with open(init_path, "w", encoding='utf-8') as f:
2828
f.write(code_imports)
2929

3030

@@ -33,7 +33,7 @@ def add_import_to_init(full_path: str, next: str, code_imports: Optional[str] =
3333
init_the_init(full_path, code_imports=code_imports)
3434

3535
init_path = os.path.join(full_path, "__init__.py")
36-
with open(init_path, "a+") as f:
36+
with open(init_path, "a+", encoding='utf-8') as f:
3737
import_stmt = "from . import {}\n".format(next)
3838
f.seek(0)
3939
lines = f.readlines()

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2", "wheel"]
33

44
[project]
55
name = "polyapi-python"
6-
version = "0.3.9"
6+
version = "0.3.10"
77
description = "The Python Client for PolyAPI, the IPaaS by Developers for Developers"
88
authors = [{ name = "Dan Fellin", email = "[email protected]" }]
99
dependencies = [

0 commit comments

Comments
 (0)