From 20488b13b13c7d69c6b27bae56d3a6329aca00a1 Mon Sep 17 00:00:00 2001 From: Dan Fellin Date: Wed, 8 May 2024 11:54:36 -0700 Subject: [PATCH 1/5] next version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d77e224..2bf6a9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.2", "wheel"] [project] name = "polyapi-python" -version = "0.2.5.dev2" +version = "0.2.5.dev3" description = "The Python Client for PolyAPI, the IPaaS by Developers for Developers" authors = [{ name = "Dan Fellin", email = "dan@polyapi.io" }] dependencies = [ From f04062b70d39d0b4d9635d3460bbd235e4a82e74 Mon Sep 17 00:00:00 2001 From: Dan Fellin Date: Wed, 8 May 2024 12:42:38 -0700 Subject: [PATCH 2/5] woohoo tests are passing --- polyapi/cli.py | 12 +++++++++--- polyapi/rendered_spec.py | 11 +++++++++++ tests/test_rendered_spec.py | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 tests/test_rendered_spec.py diff --git a/polyapi/cli.py b/polyapi/cli.py index ef2a2a9..5fbced2 100644 --- a/polyapi/cli.py +++ b/polyapi/cli.py @@ -5,7 +5,7 @@ from .config import clear_config, set_api_key_and_url from .generate import generate, clear from .function_cli import function_add_or_update -from .rendered_spec import save_rendered_specs +from .rendered_spec import get_and_update_rendered_spec CLI_COMMANDS = ["setup", "generate", "function", "clear", "help", "save_rendered_specs"] @@ -43,8 +43,14 @@ def execute_from_cli(): elif command == "setup": clear_config() generate() - elif command == "save_rendered_specs": - save_rendered_specs() + elif command == "update_rendered_spec": + assert len(args.subcommands) == 1 + updated = get_and_update_rendered_spec(args.subcommands[0]) + if updated: + print("Updated rendered spec!") + else: + print("Failed to update rendered spec!") + exit(1) elif command == "clear": print("Clearing the generated library...") clear() diff --git a/polyapi/rendered_spec.py b/polyapi/rendered_spec.py index f5e9543..f6753a6 100644 --- a/polyapi/rendered_spec.py +++ b/polyapi/rendered_spec.py @@ -5,6 +5,8 @@ def update_rendered_spec(spec: SpecificationDto): + print(spec) + return print("Updating rendered spec...") func_str, type_defs = render_spec(spec) data = { @@ -24,6 +26,15 @@ def update_rendered_spec(spec: SpecificationDto): # this needs to run with something like `kn func run...` +def get_and_update_rendered_spec(spec_id: str) -> bool: + specs = read_cached_specs() + for spec in specs: + if spec['id'] == spec_id: + update_rendered_spec(spec) + return True + return False + + def save_rendered_specs() -> None: specs = read_cached_specs() # right now we just support rendered apiFunctions diff --git a/tests/test_rendered_spec.py b/tests/test_rendered_spec.py new file mode 100644 index 0000000..8c55d31 --- /dev/null +++ b/tests/test_rendered_spec.py @@ -0,0 +1,22 @@ +from os import read +import unittest +from mock import patch + +from polyapi.rendered_spec import get_and_update_rendered_spec + + +class T(unittest.TestCase): + def test_get_and_update_rendered_spec_fail(self): + """ pass in a bad id to update and make sure it returns False + """ + updated = get_and_update_rendered_spec("123") + self.assertFalse(updated) + + @patch("polyapi.rendered_spec.read_cached_specs") + def test_get_and_update_rendered_spec_success(self, read_cached_specs): + """ pass in a bad id to update and make sure it returns False + """ + read_cached_specs.return_value = [{"id": "123"}] + updated = get_and_update_rendered_spec("123") + self.assertEqual(read_cached_specs.call_count, 1) + self.assertTrue(updated) \ No newline at end of file From 4fc0b7d988b7605f8737b7abea0bb9fdc4930e58 Mon Sep 17 00:00:00 2001 From: Dan Fellin Date: Wed, 8 May 2024 13:18:02 -0700 Subject: [PATCH 3/5] geting there --- polyapi/cli.py | 6 +++--- polyapi/rendered_spec.py | 34 +++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/polyapi/cli.py b/polyapi/cli.py index 5fbced2..6cda16b 100644 --- a/polyapi/cli.py +++ b/polyapi/cli.py @@ -18,7 +18,7 @@ """ -def execute_from_cli(): +def execute_from_cli() -> None: parser = argparse.ArgumentParser( prog="python -m polyapi", description=CLIENT_DESC, formatter_class=argparse.RawTextHelpFormatter ) @@ -44,8 +44,8 @@ def execute_from_cli(): clear_config() generate() elif command == "update_rendered_spec": - assert len(args.subcommands) == 1 - updated = get_and_update_rendered_spec(args.subcommands[0]) + assert len(args.subcommands) == 2 + updated = get_and_update_rendered_spec(args.subcommands[0], args.subcommands[1]) if updated: print("Updated rendered spec!") else: diff --git a/polyapi/rendered_spec.py b/polyapi/rendered_spec.py index f6753a6..b1830b6 100644 --- a/polyapi/rendered_spec.py +++ b/polyapi/rendered_spec.py @@ -1,12 +1,13 @@ -from typing import Dict +from typing import Dict, Optional + +import requests +from polyapi.config import get_api_key_and_url from polyapi.generate import read_cached_specs, render_spec from polyapi.execute import execute_post from polyapi.typedefs import SpecificationDto def update_rendered_spec(spec: SpecificationDto): - print(spec) - return print("Updating rendered spec...") func_str, type_defs = render_spec(spec) data = { @@ -21,17 +22,32 @@ def update_rendered_spec(spec: SpecificationDto): else: raise NotImplementedError("todo") + # use super key on develop-k8s here! resp = execute_post("/functions/rendered-specs", data) assert resp.status_code == 201, (resp.text, resp.status_code) # this needs to run with something like `kn func run...` -def get_and_update_rendered_spec(spec_id: str) -> bool: - specs = read_cached_specs() - for spec in specs: - if spec['id'] == spec_id: - update_rendered_spec(spec) - return True +def _get_spec(api_key: str, spec_id: str) -> Optional[SpecificationDto]: + base_url, _ = get_api_key_and_url() + url = f"{base_url}/specs" + headers = {"Authorization": f"Bearer {api_key}"} + resp = requests.get(url, headers=headers) + if resp.status_code == 200: + specs = resp.json() + for spec in specs: + if spec['id'] == spec_id: + return spec + return None + else: + raise NotImplementedError(resp.content) + + +def get_and_update_rendered_spec(api_key: str, spec_id: str) -> bool: + spec = _get_spec(api_key, spec_id) + if spec: + update_rendered_spec(spec) + return True return False From e779dbe65f0a7793e6974d36618f1b92bbfe334b Mon Sep 17 00:00:00 2001 From: Dan Fellin Date: Tue, 14 May 2024 10:00:52 -0700 Subject: [PATCH 4/5] next --- polyapi/cli.py | 2 +- polyapi/rendered_spec.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/polyapi/cli.py b/polyapi/cli.py index 6cda16b..cd0d2ac 100644 --- a/polyapi/cli.py +++ b/polyapi/cli.py @@ -8,7 +8,7 @@ from .rendered_spec import get_and_update_rendered_spec -CLI_COMMANDS = ["setup", "generate", "function", "clear", "help", "save_rendered_specs"] +CLI_COMMANDS = ["setup", "generate", "function", "clear", "help", "update_rendered_spec"] CLIENT_DESC = """Commands python -m polyapi setup Setup your Poly connection diff --git a/polyapi/rendered_spec.py b/polyapi/rendered_spec.py index b1830b6..5e2d8a5 100644 --- a/polyapi/rendered_spec.py +++ b/polyapi/rendered_spec.py @@ -29,7 +29,7 @@ def update_rendered_spec(spec: SpecificationDto): def _get_spec(api_key: str, spec_id: str) -> Optional[SpecificationDto]: - base_url, _ = get_api_key_and_url() + _, base_url = get_api_key_and_url() url = f"{base_url}/specs" headers = {"Authorization": f"Bearer {api_key}"} resp = requests.get(url, headers=headers) diff --git a/pyproject.toml b/pyproject.toml index 2bf6a9c..8cbf9fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.2", "wheel"] [project] name = "polyapi-python" -version = "0.2.5.dev3" +version = "0.2.5.dev4" description = "The Python Client for PolyAPI, the IPaaS by Developers for Developers" authors = [{ name = "Dan Fellin", email = "dan@polyapi.io" }] dependencies = [ From 6ddfa11158739c34a7f774ed5517c8ac5be201e6 Mon Sep 17 00:00:00 2001 From: Dan Fellin Date: Tue, 14 May 2024 10:08:55 -0700 Subject: [PATCH 5/5] next --- tests/test_rendered_spec.py | 48 ++++++++++++++++++++++++++++++------- tests/test_schema.py | 11 +++++---- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/tests/test_rendered_spec.py b/tests/test_rendered_spec.py index 8c55d31..73c5780 100644 --- a/tests/test_rendered_spec.py +++ b/tests/test_rendered_spec.py @@ -1,22 +1,52 @@ -from os import read import unittest -from mock import patch +from mock import patch, Mock from polyapi.rendered_spec import get_and_update_rendered_spec +GET_PRODUCTS_COUNT = { + "id": "8f7d24b0-4a29-40c0-9091", + "type": "serverFunction", + "context": "test", + "name": "getProductsCount111", + "description": "An API call to retrieve the count of products in the product list.", + "requirements": ["snabbdom"], + "function": { + "arguments": [ + { + "name": "products", + "required": False, + "type": { + "kind": "array", + "items": {"kind": "primitive", "type": "string"}, + }, + } + ], + "returnType": {"kind": "plain", "value": "number"}, + "synchronous": True, + }, + "code": "", + "language": "javascript", + "visibilityMetadata": {"visibility": "ENVIRONMENT"}, +} + class T(unittest.TestCase): - def test_get_and_update_rendered_spec_fail(self): + @patch("polyapi.rendered_spec._get_spec") + def test_get_and_update_rendered_spec_fail(self, _get_spec): """ pass in a bad id to update and make sure it returns False """ - updated = get_and_update_rendered_spec("123") + _get_spec.return_value = None + updated = get_and_update_rendered_spec("abc", "123") + self.assertEqual(_get_spec.call_count, 1) self.assertFalse(updated) - @patch("polyapi.rendered_spec.read_cached_specs") - def test_get_and_update_rendered_spec_success(self, read_cached_specs): + @patch("polyapi.rendered_spec.execute_post") + @patch("polyapi.rendered_spec._get_spec") + def test_get_and_update_rendered_spec_success(self, _get_spec, execute_post): """ pass in a bad id to update and make sure it returns False """ - read_cached_specs.return_value = [{"id": "123"}] - updated = get_and_update_rendered_spec("123") - self.assertEqual(read_cached_specs.call_count, 1) + _get_spec.return_value = GET_PRODUCTS_COUNT + execute_post.return_value = Mock(status_code=201, text="Created") + updated = get_and_update_rendered_spec("abc", "123") + self.assertEqual(_get_spec.call_count, 1) self.assertTrue(updated) \ No newline at end of file diff --git a/tests/test_schema.py b/tests/test_schema.py index 2908665..965ac69 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -5,7 +5,10 @@ class T(unittest.TestCase): def test_fix_titles(self): # schema = json.loads(SCHEMA) - schema = {"$schema": "https://json-schema.org/draft-06/schema#"} - a, b = generate_schema_types(schema) - # shouldnt error with unknown dialect - self.assertTrue(b) \ No newline at end of file + schema = {"$schema": "http://json-schema.org/draft-06/schema#"} + try: + a, b = generate_schema_types(schema) + except AssertionError: + pass + + # should not throw with unknown dialect error \ No newline at end of file