Skip to content

Commit 1169ef8

Browse files
authored
Merge pull request #11 from arnaudlimbourg/update-to-python-3-syntax
Update to python 3 syntax and use Github actions
2 parents 80a4401 + ee357a9 commit 1169ef8

11 files changed

Lines changed: 124 additions & 79 deletions

File tree

.github/workflows/ci.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: CI
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
python:
7+
runs-on: ubuntu-latest
8+
strategy:
9+
matrix:
10+
python-version: ["3.6", "3.7", "3.8", "3.9"]
11+
12+
steps:
13+
- uses: actions/checkout@v2
14+
15+
- name: Set up Python 3.9
16+
uses: actions/setup-python@v2
17+
with:
18+
python-version: ${{ matrix.python-version }}
19+
architecture: x64
20+
21+
- name: Install Dependencies
22+
run: pip install -e .[test]
23+
24+
- name: Test with pytest
25+
run: |
26+
pytest --cov=transloadit tests

.travis.yml

Lines changed: 0 additions & 9 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Drop Python versions before 3.6 as they are unsupported
2+
* Update code to Python 3 syntax
13
### 0.1.12/ 2020-14-12 ###
24

35
* Send `transloadit-client` header along with requests

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ A **Python** Integration for [Transloadit](https://transloadit.com)'s file uploa
1010

1111
This is a **Python** SDK to make it easy to talk to the [Transloadit](https://transloadit.com) REST API.
1212

13+
Only Python 3.6+ versions are supported.
14+
1315
## Install
1416

1517
```bash

transloadit/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.1.12'
1+
__version__ = "0.1.12"

transloadit/assembly.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ class Assembly(optionbuilder.OptionBuilder):
2525
Params to send along with the assembly. Please see
2626
https://transloadit.com/docs/api-docs/#21-create-a-new-assembly for available options.
2727
"""
28+
2829
def __init__(self, transloadit, files=None, options=None):
29-
super(Assembly, self).__init__(options)
30+
super().__init__(options)
3031
self.transloadit = transloadit
3132
self.files = files or {}
3233

@@ -45,14 +46,14 @@ def add_file(self, file_stream, field_name=None):
4546
self.files[field_name] = file_stream
4647

4748
def _get_field_name(self):
48-
name = 'file'
49+
name = "file"
4950
if name not in self.files:
5051
return name
5152

5253
counter = 1
53-
while '{}_{}'.format(name, counter) in self.files:
54+
while f"{name}_{counter}" in self.files:
5455
counter += 1
55-
return '{}_{}'.format(name, counter)
56+
return f"{name}_{counter}"
5657

5758
def remove_file(self, field_name):
5859
"""
@@ -65,14 +66,16 @@ def remove_file(self, field_name):
6566

6667
def _do_tus_upload(self, assembly_url, tus_url, retries):
6768
tus_client = tus.TusClient(tus_url)
68-
metadata = {'assembly_url': assembly_url}
69+
metadata = {"assembly_url": assembly_url}
6970
for key in self.files:
70-
metadata['fieldname'] = key
71-
metadata['filename'] = os.path.basename(self.files[key].name)
72-
tus_client.uploader(file_stream=self.files[key],
73-
chunk_size=5*1024*1024,
74-
metadata=metadata,
75-
retries=retries).upload()
71+
metadata["fieldname"] = key
72+
metadata["filename"] = os.path.basename(self.files[key].name)
73+
tus_client.uploader(
74+
file_stream=self.files[key],
75+
chunk_size=5 * 1024 * 1024,
76+
metadata=metadata,
77+
retries=retries,
78+
).upload()
7679

7780
def create(self, wait=False, resumable=True, retries=3):
7881
"""
@@ -89,35 +92,40 @@ def create(self, wait=False, resumable=True, retries=3):
8992
"""
9093
data = self.get_options()
9194
if resumable:
92-
extra_data = {'tus_num_expected_upload_files': len(self.files)}
95+
extra_data = {"tus_num_expected_upload_files": len(self.files)}
9396
response = self.transloadit.request.post(
94-
'/assemblies', extra_data=extra_data, data=data)
95-
self._do_tus_upload(response.data.get('assembly_ssl_url'),
96-
response.data.get('tus_url'),
97-
retries)
97+
"/assemblies", extra_data=extra_data, data=data
98+
)
99+
self._do_tus_upload(
100+
response.data.get("assembly_ssl_url"),
101+
response.data.get("tus_url"),
102+
retries,
103+
)
98104
else:
99105
response = self.transloadit.request.post(
100-
'/assemblies', data=data, files=self.files)
106+
"/assemblies", data=data, files=self.files
107+
)
101108

102109
if wait:
103110
while not self._assembly_finished(response):
104111
response = self.transloadit.get_assembly(
105-
assembly_url=response.data.get('assembly_ssl_url'))
112+
assembly_url=response.data.get("assembly_ssl_url")
113+
)
106114

107115
if self._rate_limit_reached(response) and retries:
108116
# wait till rate limit is expired
109-
sleep(response.data.get('info', {}).get('retryIn', 0))
117+
sleep(response.data.get("info", {}).get("retryIn", 0))
110118
self.create(wait, resumable, retries - 1)
111119

112120
return response
113121

114122
def _assembly_finished(self, response):
115-
status = response.data.get('ok')
116-
is_aborted = status == 'REQUEST_ABORTED'
117-
is_canceled = status == 'ASSEMBLY_CANCELED'
118-
is_completed = status == 'ASSEMBLY_COMPLETED'
119-
is_failed = response.data.get('error') is not None
123+
status = response.data.get("ok")
124+
is_aborted = status == "REQUEST_ABORTED"
125+
is_canceled = status == "ASSEMBLY_CANCELED"
126+
is_completed = status == "ASSEMBLY_COMPLETED"
127+
is_failed = response.data.get("error") is not None
120128
return is_aborted or is_canceled or is_completed or is_failed
121129

122130
def _rate_limit_reached(self, response):
123-
return response.data.get('error') == 'RATE_LIMIT_REACHED'
131+
return response.data.get("error") == "RATE_LIMIT_REACHED"

transloadit/client.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from . import template
44

55

6-
class Transloadit(object):
6+
class Transloadit:
77
"""
88
This class serves as a client interface to the Transloadit API.
99
@@ -24,9 +24,16 @@ class Transloadit(object):
2424
How long in seconds for which a Transloadit request should be valid. Defaults to 300
2525
if not specified.
2626
"""
27-
def __init__(self, auth_key, auth_secret, service='https://api2.transloadit.com', duration=300):
28-
if not service.startswith(('http://', 'https://')):
29-
service = 'https://' + service
27+
28+
def __init__(
29+
self,
30+
auth_key,
31+
auth_secret,
32+
service="https://api2.transloadit.com",
33+
duration=300,
34+
):
35+
if not service.startswith(("http://", "https://")):
36+
service = "https://" + service
3037

3138
self.service = service
3239
self.auth_key = auth_key
@@ -49,13 +56,13 @@ def get_assembly(self, assembly_id=None, assembly_url=None):
4956
:Args:
5057
- assembly_id (Optional[str])
5158
- assembly_url (Optional[str])
52-
59+
5360
Return an instance of <transloadit.response.Response>
5461
"""
5562
if not (assembly_id or assembly_url):
5663
raise ValueError("Either 'assembly_id' or 'assembly_url' cannot be None.")
5764

58-
url = assembly_url if assembly_url else '/assemblies/{}'.format(assembly_id)
65+
url = assembly_url if assembly_url else f"/assemblies/{assembly_id}"
5966
return self.request.get(url)
6067

6168
def list_assemblies(self, params=None):
@@ -66,10 +73,10 @@ def list_assemblies(self, params=None):
6673
- options (Optional[dict]):
6774
params to send along with the request. Please see
6875
https://transloadit.com/docs/api-docs/#25-retrieve-assembly-list for available options.
69-
76+
7077
Return an instance of <transloadit.response.Response>
7178
"""
72-
return self.request.get('/assemblies', params=params)
79+
return self.request.get("/assemblies", params=params)
7380

7481
def cancel_assembly(self, assembly_id=None, assembly_url=None):
7582
"""
@@ -79,13 +86,13 @@ def cancel_assembly(self, assembly_id=None, assembly_url=None):
7986
:Args:
8087
- assembly_id (Optional[str])
8188
- assembly_url (Optional[str])
82-
89+
8390
Return an instance of <transloadit.response.Response>
8491
"""
8592
if not (assembly_id or assembly_url):
8693
raise ValueError("Either 'assembly_id' or 'assembly_url' cannot be None.")
8794

88-
url = assembly_url if assembly_url else '/assemblies/{}'.format(assembly_id)
95+
url = assembly_url if assembly_url else f"/assemblies/{assembly_id}"
8996
return self.request.delete(url)
9097

9198
def get_template(self, template_id):
@@ -94,10 +101,10 @@ def get_template(self, template_id):
94101
95102
:Args:
96103
- template_id (str)
97-
104+
98105
Return an instance of <transloadit.response.Response>
99106
"""
100-
return self.request.get('/templates/{}'.format(template_id))
107+
return self.request.get(f"/templates/{template_id}")
101108

102109
def list_templates(self, params=None):
103110
"""
@@ -107,10 +114,10 @@ def list_templates(self, params=None):
107114
- options (Optional[dict]):
108115
params to send along with the request. Please see
109116
https://transloadit.com/docs/api-docs/#45-retrieve-template-list for available options.
110-
117+
111118
Return an instance of <transloadit.response.Response>
112119
"""
113-
return self.request.get('/templates', params=params)
120+
return self.request.get("/templates", params=params)
114121

115122
def new_template(self, name, params=None):
116123
"""
@@ -132,7 +139,7 @@ def update_template(self, template_id, data):
132139
133140
Return an instance of <transloadit.response.Response>
134141
"""
135-
return self.request.put('/templates/{}'.format(template_id), data=data)
142+
return self.request.put(f"/templates/{template_id}", data=data)
136143

137144
def delete_template(self, template_id):
138145
"""
@@ -143,7 +150,7 @@ def delete_template(self, template_id):
143150
144151
Return an instance of <transloadit.response.Response>
145152
"""
146-
return self.request.delete('/templates/{}'.format(template_id))
153+
return self.request.delete(f"/templates/{template_id}")
147154

148155
def get_bill(self, month, year):
149156
"""
@@ -152,7 +159,7 @@ def get_bill(self, month, year):
152159
:Args:
153160
- month (int): e.g 1 for January
154161
- year (int)
155-
162+
156163
Return an instance of <transloadit.response.Response>
157164
"""
158-
return self.request.get('/bill/{}-{:02d}'.format(year, month))
165+
return self.request.get(f"/bill/{year}-{month:02d}")

transloadit/optionbuilder.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import copy
22

33

4-
class OptionBuilder(object):
4+
class OptionBuilder:
55
"""
66
Object representation of a new Assembly to be created.
77
@@ -17,8 +17,9 @@ class OptionBuilder(object):
1717
params to send along with the assembly. Please see
1818
https://transloadit.com/docs/api-docs/#21-create-a-new-assembly for available options.
1919
"""
20+
2021
def __init__(self, options=None):
21-
super(OptionBuilder, self).__init__()
22+
super().__init__()
2223
self.options = options or {}
2324
self.steps = {}
2425

@@ -31,7 +32,7 @@ def add_step(self, name, robot, options):
3132
- robot (str): The name of the robot for the step
3233
- options (dict): The options to apply to the step
3334
"""
34-
options['robot'] = robot
35+
options["robot"] = robot
3536
self.steps[name] = options
3637

3738
def remove_step(self, name):
@@ -45,8 +46,8 @@ def remove_step(self, name):
4546

4647
def get_options(self):
4748
"""
48-
Return the Assembly/Template options in Transloadit, ready format.
49+
Return the Assembly/Template options in Transloadit, ready format.
4950
"""
5051
options = copy.deepcopy(self.options)
51-
options['steps'] = self.steps
52+
options["steps"] = self.steps
5253
return options

0 commit comments

Comments
 (0)