Skip to content

Commit 154dbeb

Browse files
committed
more fixes
1 parent 60843d6 commit 154dbeb

4 files changed

Lines changed: 52 additions & 18 deletions

File tree

‎stacklet/client/platform/client.py‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,11 @@ def _method(executor, function_name, snippet, pager, expr):
9292
for k, v in snippet.optional.items():
9393
defaults[k] = None
9494

95-
snippet_name = snippet.name
96-
9795
def api_func(self, **kw):
9896
params = dict(defaults)
9997
params.update(kw)
10098

101-
result = executor.run(snippet_name, variables=params)
99+
result = executor.run_snippet(snippet, variables=params)
102100
if result == {"message": "The incoming token has expired"}:
103101
# would be nicer off the 401 status code
104102
raise PlatformTokenExpired()
@@ -115,7 +113,7 @@ def api_func(self, **kw):
115113

116114
while page_info["hasNextPage"]:
117115
params["after"] = page_info["endCursor"]
118-
result = executor.run(snippet_name, variables=params)
116+
result = executor.run_snippet(snippet, variables=params)
119117
if result.get("errors"):
120118
raise PlatformApiError(result["errors"])
121119
pages.append(result)

‎stacklet/client/platform/graphql.py‎

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def __init__(self):
7171

7272
@classmethod
7373
def build(cls, variables: JSONDict | None):
74-
variables = cls._transform_variables(variables)
74+
if variables is None:
75+
variables = {}
7576

7677
if cls.snippet:
7778
split_snippet = list(filter(None, cls.snippet.split("\n")))
@@ -105,9 +106,8 @@ def build(cls, variables: JSONDict | None):
105106
return d
106107

107108
@classmethod
108-
def _transform_variables(cls, variables: JSONDict | None) -> JSONDict:
109-
if not variables:
110-
return {}
109+
def transform_variables(cls, variables: JSONDict | None) -> JSONDict:
110+
variables = variables.copy() if variables else {}
111111

112112
for name, value in variables.items():
113113
if transformer := cls.variable_transformers.get(name):
@@ -162,22 +162,32 @@ def __init__(self, api: str, token: str):
162162
}
163163
)
164164

165-
def run(self, name: str, variables: JSONDict | None = None) -> JSONDict:
166-
"""Run a named graphql snippet."""
165+
def run(
166+
self, name: str, variables: JSONDict | None = None, transform_variables: bool = False
167+
) -> JSONDict:
168+
"""Run a named graphql snippet by name."""
167169
snippet = GRAPHQL_SNIPPETS.get(name)
168170
if not snippet:
169171
raise UnknownSnippet(name)
170172

171-
return self._run_snippet(snippet, variables=variables)
173+
return self.run_snippet(
174+
snippet, variables=variables, transform_variables=transform_variables
175+
)
172176

173177
def run_query(self, query: str) -> JSONDict:
174178
"""Run a literal GraphQL query string."""
175179
snippet = type("AdHocSnippet", (AdHocSnippet,), {"snippet": query})
176-
return self._run_snippet(snippet)
180+
return self.run_snippet(snippet)
177181

178-
def _run_snippet(
179-
self, snippet: type[StackletGraphqlSnippet], variables: JSONDict | None = None
182+
def run_snippet(
183+
self,
184+
snippet: type[StackletGraphqlSnippet],
185+
variables: JSONDict | None = None,
186+
transform_variables: bool = False,
180187
) -> JSONDict:
188+
"""Run a graphql snippet."""
189+
if transform_variables:
190+
variables = snippet.transform_variables(variables)
181191
request = snippet.build(variables)
182192
self.log.debug("Request: %s" % json.dumps(request, indent=2))
183193
res = self.session.post(self.api, json=request)

‎stacklet/client/platform/graphql_cli.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def run_graphql(context: StackletContext, name=None, variables=None, snippet=Non
3030
if snippet:
3131
res = context.executor.run_query(snippet)
3232
else:
33-
res = context.executor.run(name, variables=variables)
33+
res = context.executor.run(name, variables=variables, transform_variables=True)
3434
if raw:
3535
return res
3636
fmt = context.formatter()

‎tests/test_graphql.py‎

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,36 @@ def test_executor_run_query(self, requests_adapter, executor):
8080
requests_adapter.post(requests_mock.ANY, json=payload)
8181
assert executor.run_query(snippet) == payload
8282

83+
@pytest.mark.parametrize("transform_variables", [False, True])
84+
def test_executor_run_snippet(self, requests_adapter, executor, transform_variables):
85+
class TransformSnippet(StackletGraphqlSnippet):
86+
name = "test-transform-snippet"
87+
snippet = """
88+
query {
89+
sample(somevar: $somevar) {
90+
foo
91+
bar
92+
}
93+
}
94+
"""
95+
variable_transformers = {"somevar": lambda x: x.upper()}
96+
97+
requests_adapter.register_uri(
98+
"POST",
99+
"mock://stacklet.acme.org/api",
100+
json={"data": {"sample": {"foo": "bar"}}},
101+
)
102+
103+
executor.run_snippet(
104+
TransformSnippet, variables={"somevar": "test"}, transform_variables=transform_variables
105+
)
106+
107+
payload = requests_adapter.last_request.json()
108+
assert payload["variables"]["somevar"] == "TEST" if transform_variables else "test"
109+
83110

84111
class TestStackletGraphqlSnippet:
85-
def test_build_expands_variables(self):
112+
def test_build(self):
86113
class Snippet(StackletGraphqlSnippet):
87114
name = "sample"
88115
snippet = """
@@ -93,7 +120,6 @@ class Snippet(StackletGraphqlSnippet):
93120
}
94121
}
95122
"""
96-
variable_transformers = {"somevar": lambda x: x.upper()}
97123

98124
result = Snippet.build({"somevar": "test"})
99125
assert result == {
@@ -104,5 +130,5 @@ class Snippet(StackletGraphqlSnippet):
104130
}
105131
}
106132
""",
107-
"variables": {"somevar": "TEST"},
133+
"variables": {"somevar": "test"},
108134
}

0 commit comments

Comments
 (0)