Skip to content

Commit 7f106b8

Browse files
authored
add actions (#1)
* Add GitHub actions * Add tox to execute pytest * Update to use paths instead of full url
1 parent 781c63e commit 7f106b8

File tree

8 files changed

+125
-83
lines changed

8 files changed

+125
-83
lines changed

.github/workflows/pythonapp.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Tox
2+
3+
on: [push]
4+
5+
jobs:
6+
build:
7+
8+
runs-on: ubuntu-latest
9+
10+
steps:
11+
- uses: actions/checkout@v1
12+
- name: Set up Python 3.7
13+
uses: actions/setup-python@v1
14+
with:
15+
python-version: 3.7
16+
- name: Install dependencies
17+
run: |
18+
python -m pip install --upgrade pip
19+
pip install tox
20+
- name: Test with pytest
21+
run: |
22+
tox

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,7 @@ venv.bak/
102102

103103
# mypy
104104
.mypy_cache/
105+
106+
# IDE
107+
.idea/
108+
.vscode/

requirements.testing.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pytest
2+
pytest-mock
3+
requests-mock

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
requests

setup.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from setuptools import setup, find_packages
2+
3+
setup(
4+
name='testspace-python',
5+
version='',
6+
packages=find_packages(include=['testspace', 'testspace.*']),
7+
url='',
8+
license="MIT license",
9+
author="Jeffrey Schultz",
10+
author_email='[email protected]',
11+
description="Module for interacting with Testspace Server",
12+
install_requires=[
13+
'requests',
14+
]
15+
)

tests/test_testspace_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
@pytest.fixture(scope="function")
1010
def load_json(request):
11-
with open(os.path.join("mock_requests", request.param)) as file_handle:
11+
with open(os.path.join("tests", "mock_requests", request.param)) as file_handle:
1212
return json.load(file_handle)
1313

1414

@@ -399,7 +399,7 @@ def test_get_result_contents_nested(load_json, testspace_api, requests_mock):
399399
),
400400
json=load_json,
401401
)
402-
response_json = testspace_api.get_result_contents(result, path="tests")
402+
response_json = testspace_api.get_result_contents(result, contents_path="tests")
403403

404404
assert response_json == load_json
405405

testspace/testspace.py

Lines changed: 70 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -74,127 +74,110 @@ def get_api_endpoints(self):
7474
return self.get_request_json()
7575

7676
def get_projects(self, limit=30):
77-
return self.get_request_json(request_url=self.get_projects_url(), limit=limit)
77+
return self.get_request_json(path=self.get_projects_path(), limit=limit)
7878

7979
def get_project(self, project=None):
80-
return self.get_request_json(request_url=self.get_project_url(project))
80+
return self.get_request_json(path=self.get_project_path(project))
8181

8282
def get_spaces(self, project=None, limit=30):
83-
return self.get_request_json(
84-
request_url=self.get_spaces_url(project), limit=limit
85-
)
83+
return self.get_request_json(path=self.get_spaces_path(project), limit=limit)
8684

8785
def get_space(self, project=None, space=None):
88-
return self.get_request_json(request_url=self.get_space_url(project, space))
86+
return self.get_request_json(path=self.get_space_path(project, space))
8987

9088
def get_results(self, project=None, space=None, limit=30):
9189
return self.get_request_json(
92-
request_url=self.get_results_url(project, space), limit=limit
90+
path=self.get_results_path(project, space), limit=limit
9391
)
9492

9593
def get_result(self, result, project=None, space=None):
96-
return self.get_request_json(
97-
request_url=self.get_result_url(result, project, space)
98-
)
94+
return self.get_request_json(path=self.get_result_path(result, project, space))
9995

10096
def get_result_failures(self, result, project=None, space=None, limit=30):
10197
return self.get_request_json(
102-
self.get_result_url(result, project, space), path="failures", limit=limit
98+
path="/".join([self.get_result_path(result, project, space), "failures"]),
99+
limit=limit,
103100
)
104101

105102
def get_result_contents(
106-
self, result, path=None, project=None, space=None, limit=30
103+
self, result, contents_path=None, project=None, space=None, limit=30
107104
):
108-
if path is None:
109-
path = "contents"
110-
elif "contents" not in path:
111-
path = "/".join(["contents", path])
105+
if contents_path is None:
106+
contents_path = "contents"
107+
elif contents_path.startswith("contents") is not True:
108+
contents_path = "/".join(["contents", contents_path])
112109
return self.get_request_json(
113-
self.get_result_url(result, project, space), path=path, limit=limit
110+
path="/".join(
111+
[self.get_result_path(result, project, space), contents_path]
112+
),
113+
limit=limit,
114114
)
115115

116116
def get_metrics(self, project=None, space=None, limit=30):
117-
return self.get_request_json(self.get_metrics_url(project, space), limit=limit)
117+
return self.get_request_json(self.get_metrics_path(project, space), limit=limit)
118118

119119
def get_metric(self, metric, project=None, space=None):
120120
if type(metric) is not int:
121121
raise ValueError
122-
return self.get_request_json(self.get_metric_url(metric, project, space))
122+
return self.get_request_json(self.get_metric_path(metric, project, space))
123123

124124
def get_metric_datasets(self, metric, project=None, space=None, limit=30):
125125
return self.get_request_json(
126-
self.get_metric_url(metric, project, space), path="datasets", limit=limit
126+
"/".join([self.get_metric_path(metric, project, space), "datasets"]),
127+
limit=limit,
127128
)
128129

129130
def post_projects(self, payload):
130-
return self.post_request_json(
131-
request_url=self.get_projects_url(), payload=payload
132-
)
131+
return self.post_request_json(path=self.get_projects_path(), payload=payload)
133132

134133
def post_spaces(self, payload):
135-
return self.post_request_json(
136-
request_url=self.get_spaces_url(), payload=payload
137-
)
134+
return self.post_request_json(path=self.get_spaces_path(), payload=payload)
138135

139136
def post_results(self, payload):
140-
return self.post_request_json(
141-
request_url=self.get_results_url(), payload=payload
142-
)
137+
return self.post_request_json(path=self.get_results_path(), payload=payload)
143138

144139
def post_metrics(self, payload):
145-
return self.post_request_json(
146-
request_url=self.get_metrics_url(), payload=payload
147-
)
140+
return self.post_request_json(path=self.get_metrics_path(), payload=payload)
148141

149142
def patch_project(self, payload, project=None):
150143
return self.patch_request(
151-
request_url=self.get_project_url(project=project), payload=payload
144+
path=self.get_project_path(project=project), payload=payload
152145
)
153146

154147
def patch_space(self, payload, project=None, space=None):
155148
return self.patch_request(
156-
request_url=self.get_space_url(project=project, space=space),
157-
payload=payload,
149+
path=self.get_space_path(project=project, space=space), payload=payload
158150
)
159151

160152
def patch_metric(self, payload, metric):
161-
return self.patch_request(
162-
request_url=self.get_metric_url(metric), payload=payload
163-
)
153+
return self.patch_request(path=self.get_metric_path(metric), payload=payload)
164154

165155
def patch_result(self, payload, result):
166-
return self.patch_request(
167-
request_url=self.get_result_url(result), payload=payload
168-
)
156+
return self.patch_request(path=self.get_result_path(result), payload=payload)
169157

170158
def delete_project(self, project=None):
171-
return self.delete_request(request_url=self.get_project_url(project=project))
159+
return self.delete_request(path=self.get_project_path(project=project))
172160

173161
def delete_space(self, project=None, space=None):
174162
return self.delete_request(
175-
request_url=self.get_space_url(project=project, space=space)
163+
path=self.get_space_path(project=project, space=space)
176164
)
177165

178166
def delete_result(self, result):
179-
return self.delete_request(request_url=self.get_result_url(result))
167+
return self.delete_request(path=self.get_result_path(result))
180168

181169
def delete_metric(self, metric):
182-
return self.delete_request(request_url=self.get_metric_url(metric))
170+
return self.delete_request(path=self.get_metric_path(metric))
183171

184-
def get_request(self, request_url=None, path=None):
185-
if request_url is None:
186-
request_url = self.get_api_url()
187-
if path is not None:
188-
request_url = "/".join([request_url, path])
189-
190-
response = self._api_request("GET", request_url)
172+
def get_request(self, path=None):
173+
response = self._api_request("GET", path=path)
191174
return response
192175

193-
def get_request_json(self, request_url=None, path=None, limit=30):
176+
def get_request_json(self, path=None, limit=30):
194177
if type(limit) is not int or limit <= 0:
195178
raise ValueError
196-
response = self.get_request(request_url, path)
197-
if len(response.links) is 0:
179+
response = self.get_request(path)
180+
if len(response.links) == 0:
198181
return response.json()
199182
else:
200183
next_url = response.links.get("next", None)
@@ -205,63 +188,69 @@ def get_request_json(self, request_url=None, path=None, limit=30):
205188
response_json.extend(response.json())
206189
return response_json[:limit]
207190

208-
def post_request(self, payload, request_url):
209-
response = self._api_request("POST", request_url, payload)
191+
def post_request(self, payload, path=None):
192+
response = self._api_request("POST", path=path, payload=payload)
210193
return response
211194

212-
def post_request_json(self, payload, request_url):
213-
response = self.post_request(payload, request_url)
195+
def post_request_json(self, payload, path=None):
196+
response = self.post_request(payload, path=path)
214197
return response.json()
215198

216-
def patch_request(self, payload, request_url=None):
217-
response = self._api_request("PATCH", request_url, payload)
199+
def patch_request(self, payload, path=None):
200+
response = self._api_request("PATCH", path=path, payload=payload)
218201
return response
219202

220-
def delete_request(self, request_url):
221-
response = self._api_request("DELETE", request_url)
203+
def delete_request(self, path=None):
204+
response = self._api_request("DELETE", path=path)
222205
return response
223206

224207
def get_api_url(self):
225208
return self.api_url
226209

227-
def get_projects_url(self):
228-
return "/".join([self.get_api_url(), "projects"])
210+
def get_projects_path(self):
211+
return "projects"
229212

230-
def get_project_url(self, project=None):
213+
def get_project_path(self, project=None):
231214
if project is None:
232215
if self.project is not None:
233216
project = self.project
234217
else:
235218
raise ValueError
236-
return "/".join([self.get_projects_url(), str(project)])
219+
return "/".join([self.get_projects_path(), str(project)])
237220

238-
def get_spaces_url(self, project=None):
239-
return "/".join([self.get_project_url(project), "spaces"])
221+
def get_spaces_path(self, project=None):
222+
return "/".join([self.get_project_path(project), "spaces"])
240223

241-
def get_space_url(self, project=None, space=None):
224+
def get_space_path(self, project=None, space=None):
242225
if project is None and type(space) is int:
243-
return "/".join([self.get_api_url(), "spaces", str(space)])
226+
return "/".join(["spaces", str(space)])
244227
elif space is None:
245228
if self.space is not None:
246229
space = self.space
247230
else:
248231
raise ValueError
249232

250-
return "/".join([self.get_spaces_url(project), str(space)])
233+
return "/".join([self.get_spaces_path(project), str(space)])
251234

252-
def get_results_url(self, project=None, space=None):
253-
return "/".join([self.get_space_url(project, space), "results"])
235+
def get_results_path(self, project=None, space=None):
236+
return "/".join([self.get_space_path(project, space), "results"])
254237

255-
def get_result_url(self, result, project=None, space=None):
256-
return "/".join([self.get_results_url(project, space), str(result)])
238+
def get_result_path(self, result, project=None, space=None):
239+
return "/".join([self.get_results_path(project, space), str(result)])
257240

258-
def get_metrics_url(self, project=None, space=None):
259-
return "/".join([self.get_space_url(project, space), "metrics"])
241+
def get_metrics_path(self, project=None, space=None):
242+
return "/".join([self.get_space_path(project, space), "metrics"])
260243

261-
def get_metric_url(self, metric, project=None, space=None):
262-
return "/".join([self.get_metrics_url(project, space), str(metric)])
244+
def get_metric_path(self, metric, project=None, space=None):
245+
return "/".join([self.get_metrics_path(project, space), str(metric)])
263246

264-
def _api_request(self, method, request_url, payload=None):
247+
def _api_request(self, method, path, payload=None):
248+
if path is None:
249+
request_url = self.get_api_url()
250+
elif self.get_api_url() in path:
251+
request_url = path
252+
else:
253+
request_url = "/".join([self.get_api_url(), path])
265254
response = requests.request(
266255
method=method,
267256
url=request_url,

tox.ini

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[testenv]
2+
deps =
3+
-r{toxinidir}/requirements.txt
4+
-r{toxinidir}/requirements.testing.txt
5+
6+
setenv = PYTHONPATH = {toxinidir}
7+
8+
commands=pytest tests

0 commit comments

Comments
 (0)