Skip to content

Commit 42cfd4f

Browse files
Merge pull request #23 from synccomputingcode/graham/python-3.7
PROD-820 Expand supported the library's Python versions to [3.7,3.11]
2 parents 7b2fe57 + f664d8e commit 42cfd4f

23 files changed

+368
-290
lines changed

.github/workflows/pull-request.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ jobs:
1414
with:
1515
fetch-depth: 0
1616

17-
- name: Set up Python 3.10.x
17+
- name: Set up Python 3.7.x
1818
uses: actions/setup-python@v4
1919
with:
20-
python-version: "3.10.9"
20+
python-version: "3.7.5"
2121

2222
- name: Install dependencies
2323
run: pip install .[dev]

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ jobs:
5959
- uses: actions/checkout@v3
6060
- uses: actions/setup-python@v4
6161
with:
62-
python-version: "3.10"
62+
python-version: "3.7.5"
6363
- name: Install dependencies
6464
run: pip install .[dev]
6565
- name: Build docs

demo/install_cli.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function find_python() {
77
local python_candidate
88

99
while read python_candidate; do
10-
if [[ $("$python_candidate" --version 2>/dev/null) =~ (^|[^[:digit:].])3.10(\.|$) ]]; then
10+
if [[ $("$python_candidate" --version 2>/dev/null) =~ (^|[^[:digit:].])3\.(7|8|9|10|11)(\.|$) ]]; then
1111
echo $python_candidate
1212
return
1313
fi

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ build-backend = "hatchling.build"
1313
name = "syncsparkpy"
1414
authors = [{"name" = "Sync Computing"}]
1515
readme = "README.md"
16-
requires-python = ">=3.10"
16+
requires-python = ">=3.7"
1717
classifiers = [
1818
"Intended Audience :: Information Technology",
1919
"Intended Audience :: System Administrators",
@@ -43,7 +43,7 @@ dev = [
4343
"pytest==7.2.0",
4444
"pytest-env==0.8.1",
4545
"pytest-asyncio==0.21.0",
46-
"Sphinx==5.3.0",
46+
"Sphinx==4.3.0",
4747
"respx==0.20.1",
4848
"deepdiff==6.3.0",
4949
]
@@ -59,7 +59,7 @@ Home = "https://github.com/synccomputingcode/syncsparkpy"
5959

6060
[tool.black]
6161
line-length = 100
62-
target-version = ['py310']
62+
target-version = ['py37']
6363

6464
[tool.isort]
6565
profile = "black"

sync/api/predictions.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88

99
import boto3 as boto
1010
import httpx
11+
from typing import List
1112

1213
from sync.clients.sync import get_default_client
1314
from sync.models import Platform, PredictionError, Response
1415

1516
logger = logging.getLogger(__name__)
1617

1718

18-
def get_products() -> Response[list[str]]:
19+
def get_products() -> Response[List[str]]:
1920
"""Get supported platforms
2021
2122
:return: list of platform names
@@ -43,7 +44,8 @@ def generate_prediction(
4344
"""
4445
response = create_prediction(platform, cluster_report, eventlog_url)
4546

46-
if prediction_id := response.result:
47+
prediction_id = response.result
48+
if prediction_id:
4749
return wait_for_prediction(prediction_id, preference)
4850

4951
return response
@@ -60,8 +62,8 @@ def wait_for_prediction(prediction_id: str, preference: str = None) -> Response[
6062
:rtype: Response[dict]
6163
"""
6264
response = wait_for_final_prediction_status(prediction_id)
63-
64-
if result := response.result:
65+
result = response.result
66+
if result:
6567
if result == "SUCCESS":
6668
return get_prediction(prediction_id, preference)
6769

@@ -84,7 +86,8 @@ def get_prediction(prediction_id: str, preference: str = None) -> Response[dict]
8486
prediction_id, {"preference": preference} if preference else None
8587
)
8688

87-
if result := response.get("result"):
89+
result = response.get("result")
90+
if result:
8891
return Response(result=result)
8992

9093
return Response(**response)
@@ -100,15 +103,16 @@ def get_status(prediction_id: str) -> Response[str]:
100103
"""
101104
response = get_default_client().get_prediction_status(prediction_id)
102105

103-
if result := response.get("result"):
106+
result = response.get("result")
107+
if result:
104108
return Response(result=result["status"])
105109

106110
return Response(**response)
107111

108112

109113
def get_predictions(
110114
product: str = None, project_id: str = None, preference: str = None
111-
) -> Response[list[dict]]:
115+
) -> Response[List[dict]]:
112116
"""Get predictions
113117
114118
:param product: platform to filter by, e.g. "aws-emr", defaults to None
@@ -144,8 +148,10 @@ def wait_for_final_prediction_status(prediction_id: str) -> Response[str]:
144148
:return: prediction status, e.g. "SUCCESS"
145149
:rtype: Response[str]
146150
"""
147-
while response := get_default_client().get_prediction_status(prediction_id):
148-
if result := response.get("result"):
151+
response = get_default_client().get_prediction_status(prediction_id)
152+
while response:
153+
result = response.get("result")
154+
if result:
149155
if result["status"] in ("SUCCESS", "FAILURE"):
150156
return Response(result=result["status"])
151157
else:
@@ -154,6 +160,8 @@ def wait_for_final_prediction_status(prediction_id: str) -> Response[str]:
154160
logger.info("Waiting for prediction")
155161
sleep(10)
156162

163+
response = get_default_client().get_prediction_status(prediction_id)
164+
157165
return Response(error=PredictionError(message="Failed to get prediction status"))
158166

159167

@@ -221,16 +229,16 @@ def create_prediction(
221229
:return: prediction ID
222230
:rtype: Response[str]
223231
"""
224-
match urlparse(eventlog_url).scheme:
225-
case "s3":
226-
response = generate_presigned_url(eventlog_url)
227-
if response.error:
228-
return response
229-
eventlog_http_url = response.result
230-
case "http" | "https":
231-
eventlog_http_url = eventlog_url
232-
case _:
233-
return Response(error=PredictionError(message="Unsupported event log URL scheme"))
232+
scheme = urlparse(eventlog_url).scheme
233+
if scheme == "s3":
234+
response = generate_presigned_url(eventlog_url)
235+
if response.error:
236+
return response
237+
eventlog_http_url = response.result
238+
elif scheme in {"http", "https"}:
239+
eventlog_http_url = eventlog_url
240+
else:
241+
return Response(error=PredictionError(message="Unsupported event log URL scheme"))
234242

235243
response = get_default_client().create_prediction(
236244
{

sync/api/projects.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import logging
55

6+
from typing import List
7+
68
from sync.api.predictions import get_predictions
79
from sync.clients.sync import get_default_client
810
from sync.models import Preference, ProjectError, Response
@@ -21,14 +23,16 @@ def get_prediction(project_id: str, preference: Preference = None) -> Response[d
2123
:rtype: Response[dict]
2224
"""
2325
project_response = get_project(project_id)
24-
if project := project_response.result:
26+
project = project_response.result
27+
if project:
2528
predictions_response = get_predictions(
2629
project_id=project_id, preference=preference or project.get("preference")
2730
)
2831
if predictions_response.error:
2932
return predictions_response
3033

31-
if predictions := predictions_response.result:
34+
predictions = predictions_response.result
35+
if predictions:
3236
return Response(result=predictions[0])
3337
return Response(error=ProjectError(message="No predictions in the project"))
3438
return project_response
@@ -123,13 +127,14 @@ def get_project_by_app_id(app_id: str) -> Response[dict]:
123127
if response.get("error"):
124128
return Response(**response)
125129

126-
if projects := response.get("result"):
130+
projects = response.get("result")
131+
if projects:
127132
return Response(result=projects[0])
128133

129134
return Response(error=ProjectError(message=f"No project found for '{app_id}'"))
130135

131136

132-
def get_projects(app_id: str = None) -> Response[list[dict]]:
137+
def get_projects(app_id: str = None) -> Response[List[dict]]:
133138
"""Returns all projects authorized by the API key
134139
135140
:param app_id: app ID to filter by, defaults to None

sync/asyncapi/predictions.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from asyncio import sleep
33
from urllib.parse import urlparse
44

5+
from typing import List
6+
57
from sync.api.predictions import generate_presigned_url
68
from sync.clients.sync import get_default_async_client
79
from sync.models import Platform, PredictionError, Response
@@ -27,7 +29,8 @@ async def generate_prediction(
2729
"""
2830
response = await create_prediction(platform, cluster_report, eventlog_url)
2931

30-
if prediction_id := response.result:
32+
prediction_id = response.result
33+
if prediction_id:
3134
return await wait_for_prediction(prediction_id, preference)
3235

3336
return response
@@ -45,7 +48,8 @@ async def wait_for_prediction(prediction_id: str, preference: str) -> Response[d
4548
"""
4649
response = await wait_for_final_prediction_status(prediction_id)
4750

48-
if result := response.result:
51+
result = response.result
52+
if result:
4953
if result == "SUCCESS":
5054
return await get_prediction(prediction_id, preference)
5155

@@ -68,15 +72,16 @@ async def get_prediction(prediction_id: str, preference: str = None) -> Response
6872
prediction_id, {"preference": preference} if preference else None
6973
)
7074

71-
if result := response.get("result"):
75+
result = response.get("result")
76+
if result:
7277
return Response(result=result)
7378

7479
return Response(**response)
7580

7681

7782
async def get_predictions(
7883
product: str = None, project_id: str = None, preference: str = None
79-
) -> Response[list[dict]]:
84+
) -> Response[List[dict]]:
8085
"""Get predictions
8186
8287
:param product: platform to filter by, e.g. "aws-emr", defaults to None
@@ -112,8 +117,10 @@ async def wait_for_final_prediction_status(prediction_id: str) -> Response[str]:
112117
:return: prediction status, e.g. "SUCCESS"
113118
:rtype: Response[str]
114119
"""
115-
while response := await get_default_async_client().get_prediction_status(prediction_id):
116-
if result := response.get("result"):
120+
response = await get_default_async_client().get_prediction_status(prediction_id)
121+
while response:
122+
result = response.get("result")
123+
if result:
117124
if result["status"] in ("SUCCESS", "FAILURE"):
118125
return Response(result=result["status"])
119126
else:
@@ -122,6 +129,8 @@ async def wait_for_final_prediction_status(prediction_id: str) -> Response[str]:
122129
logger.info("Waiting for prediction")
123130
await sleep(10)
124131

132+
response = await get_default_async_client().get_prediction_status(prediction_id)
133+
125134
return Response(error=PredictionError(message="Failed to get prediction status"))
126135

127136

@@ -141,16 +150,17 @@ async def create_prediction(
141150
:return: prediction ID
142151
:rtype: Response[str]
143152
"""
144-
match urlparse(eventlog_url).scheme:
145-
case "s3":
146-
response = generate_presigned_url(eventlog_url)
147-
if response.error:
148-
return response
149-
eventlog_http_url = response.result
150-
case "http" | "https":
151-
eventlog_http_url = eventlog_url
152-
case _:
153-
return Response(error=PredictionError(message="Unsupported event log URL scheme"))
153+
scheme = urlparse(eventlog_url).scheme
154+
155+
if scheme == "s3":
156+
response = generate_presigned_url(eventlog_url)
157+
if response.error:
158+
return response
159+
eventlog_http_url = response.result
160+
elif scheme in {"http", "https"}:
161+
eventlog_http_url = eventlog_url
162+
else:
163+
return Response(error=PredictionError(message="Unsupported event log URL scheme"))
154164

155165
response = await get_default_async_client().create_prediction(
156166
{

sync/asyncawsemr.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ async def create_prediction_for_cluster(cluster_id: str, region_name: str = None
3636
:rtype: Response[str]
3737
"""
3838
report_response = get_cluster_report(cluster_id, region_name)
39-
if cluster_report := report_response.result:
39+
cluster_report = report_response.result
40+
if cluster_report:
4041
eventlog_response = _get_eventlog_url_from_cluster_report(cluster_report)
4142
if eventlog_response.error:
4243
return eventlog_response
4344

44-
if eventlog_http_url := eventlog_response.result:
45+
eventlog_http_url = eventlog_response.result
46+
if eventlog_http_url:
4547
return await create_prediction(Platform.AWS_EMR, cluster_report, eventlog_http_url)
4648

4749
return eventlog_response

0 commit comments

Comments
 (0)