Skip to content

Commit ddb5c8b

Browse files
author
AndyEveritt
committed
update file upload & base_url property
1 parent 0a38b3d commit ddb5c8b

10 files changed

Lines changed: 49 additions & 49 deletions

File tree

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 1.1.2-b1
2+
current_version = 1.1.2-b3
33
commit = False
44
tag = False
55
allow_dirty = False

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ verbosity=1
88
# `bumpversion --tag release
99

1010
update_dist:
11-
rm dist/*
11+
rm dist/* -f
1212
python setup.py sdist bdist_wheel
1313

1414
check_dist:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Method | Description
3535
`get_model(key: str = None) -> Dict` | Get Duet object model. RRF3 only
3636
`send_code(code: str) -> Dict` | Send G/M/T-code to Duet
3737
`get_file(filename: str, directory: str = 'gcodes') -> str` | Download file from Duet
38-
`upload_file(file: str, directory: str = 'gcodes') -> Dict` | Upload file to Duet
38+
`upload_file(file: StringIO | TextIOWrapper, filename: str, directory: str = 'gcodes') -> Dict` | Upload file to Duet
3939
`get_fileinfo(filename: str = None, directory: str = 'gcodes') -> Dict` | Get file info
4040
`delete_file(filename: str, directory: str = 'gcodes') -> Dict` | Delete file on Duet
4141
`move_file(from_path: str, to_path: str, force: bool = False) -> Dict` | Move file on Duet, can be used to rename files

duetwebapi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = "1.1.2-b1"
1+
__version__ = "1.1.2-b3"
22

33
from .dwa_factory import DuetWebAPI

duetwebapi/api/base.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from typing import Dict, List
1+
from typing import Dict, List, Union
2+
from io import StringIO, TextIOWrapper
23
import requests
34
import os
45
import logging
@@ -8,13 +9,18 @@ class DuetAPI:
89
api_name = ''
910

1011
def __init__(self, base_url: str) -> None:
11-
if not base_url.startswith('http://'):
12-
base_url = f'http://{base_url}'
13-
self._base_url = base_url
12+
self.base_url = base_url
1413

14+
@property
1515
def base_url(self):
1616
return self._base_url
1717

18+
@base_url.setter
19+
def base_url(self, value: str):
20+
if not value.startswith('http://'):
21+
value = f'http://{value}'
22+
self._base_url = base_url
23+
1824
def get_model(self, key: str = None) -> Dict:
1925
""" Get Duet object model. RRF3 only """
2026
raise NotImplementedError
@@ -27,7 +33,7 @@ def get_file(self, filename: str, directory: str = 'gcodes') -> str:
2733
""" Get file from Duet """
2834
raise NotImplementedError
2935

30-
def upload_file(self, file: str, directory: str = 'gcodes') -> Dict:
36+
def upload_file(self, file: Union[StringIO, TextIOWrapper], filename: str, directory: str = 'gcodes') -> Dict:
3137
""" Upload file to Duet """
3238
raise NotImplementedError
3339

@@ -50,5 +56,3 @@ def get_directory(self, directory: str) -> List[Dict]:
5056
def create_directory(self, directory: str) -> Dict:
5157
""" Create a new directory """
5258
raise NotImplementedError
53-
54-
pass

duetwebapi/api/dsf_api.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import os
3-
from typing import Dict, List
3+
from typing import Dict, List, Union
4+
from io import StringIO, TextIOWrapper
45

56
import requests
67

@@ -17,16 +18,13 @@ class DSFAPI(DuetAPI):
1718
api_name = 'DSF_REST'
1819

1920
def get_model(self, **_ignored) -> Dict:
20-
url = f'{self._base_url}/machine/status'
21+
url = f'{self.base_url}/machine/status'
2122
r = requests.get(url)
22-
if not r.ok:
23-
raise ValueError
24-
j: Dict = r.json()
25-
result = j['result'] if j.get('result') else j
26-
return result
23+
j = r.json()
24+
return j
2725

2826
def send_code(self, code: str) -> Dict:
29-
url = f'{self._base_url}/machine/code'
27+
url = f'{self.base_url}/machine/code'
3028
r = requests.post(url, data=code)
3129
return {'response': r.text}
3230

@@ -37,58 +35,55 @@ def get_file(self, filename: str, directory: str = 'gcodes') -> str:
3735
3836
returns the file as a string
3937
"""
40-
url = f'{self._base_url}/machine/file/{directory}/{filename}'
38+
url = f'{self.base_url}/machine/file/{directory}/{filename}'
4139
r = requests.get(url)
4240
if not r.ok:
4341
raise ValueError
4442
return r.text
4543

46-
def upload_file(self, file: str, directory: str = 'gcodes') -> Dict:
44+
def upload_file(self, file: Union[StringIO, TextIOWrapper], filename: str, directory: str = 'gcodes') -> Dict:
4745
"""
4846
file: the path to the file you want to upload from your PC
4947
directory: the folder that the file is in, options are ['gcodes', 'macros', 'sys']
5048
5149
returns the file as a string
5250
"""
53-
file = os.path.abspath(file).replace('\\', '/')
54-
filename = file.split('/')[-1]
55-
url = f'{self._base_url}/machine/file/{directory}/{filename}'
56-
with open(file, 'rb') as f:
57-
r = requests.put(url, data=f, headers={'Content-Type': 'application/octet-stream'})
51+
url = f'{self.base_url}/machine/file/{directory}/{filename}'
52+
r = requests.put(url, data=file, headers={'Content-Type': 'application/octet-stream'})
5853
if not r.ok:
5954
raise ValueError
6055
return {'err': 0}
6156

6257
def get_fileinfo(self, filename: str = None, directory: str = 'gcodes') -> Dict:
63-
url = f'{self._base_url}/machine/fileinfo/{directory}/{filename}'
58+
url = f'{self.base_url}/machine/fileinfo/{directory}/{filename}'
6459
r = requests.get(url)
6560
if not r.ok:
6661
raise ValueError
6762
return r.json()
6863

6964
def delete_file(self, filename: str, directory: str = 'gcodes') -> Dict:
70-
url = f'{self._base_url}/machine/file/{directory}/{filename}'
65+
url = f'{self.base_url}/machine/file/{directory}/{filename}'
7166
r = requests.delete(url)
7267
if not r.ok:
7368
raise ValueError
7469
return {'err': 0}
7570

7671
def move_file(self, from_path: str, to_path: str, force: bool = False) -> Dict:
77-
url = f'{self._base_url}/machine/file/move'
72+
url = f'{self.base_url}/machine/file/move'
7873
r = requests.post(url, {'from': f'{from_path}', 'to': f'{to_path}', 'force': force})
7974
if not r.ok:
8075
raise ValueError
8176
return {'err': 0}
8277

8378
def get_directory(self, directory: str) -> List[Dict]:
84-
url = f'{self._base_url}/machine/directory/{directory}'
79+
url = f'{self.base_url}/machine/directory/{directory}'
8580
r = requests.get(url)
8681
if not r.ok:
8782
raise ValueError
8883
return r.json()
8984

9085
def create_directory(self, directory: str) -> Dict:
91-
url = f'{self._base_url}/machine/directory/{directory}'
86+
url = f'{self.base_url}/machine/directory/{directory}'
9287
r = requests.put(url)
9388
if not r.ok:
9489
raise ValueError

duetwebapi/api/dwc_api.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import os
3-
from typing import Dict, List
3+
from typing import Dict, List, Union
4+
from io import StringIO, TextIOWrapper
45

56
import requests
67

@@ -17,15 +18,15 @@ class DWCAPI(DuetAPI):
1718
api_name = 'DWC_REST'
1819

1920
def get_model(self, key: str = None) -> Dict:
20-
url = f'{self._base_url}/rr_model'
21+
url = f'{self.base_url}/rr_model'
2122
r = requests.get(url, {'flags': 'd99vn', 'key': key})
2223
if not r.ok:
2324
raise ValueError
2425
j = r.json()
2526
return j['result']
2627

2728
def send_code(self, code: str) -> Dict:
28-
url = f'{self._base_url}/rr_gcode'
29+
url = f'{self.base_url}/rr_gcode'
2930
r = requests.get(url, {'gcode': code})
3031
if not r.ok:
3132
raise ValueError
@@ -38,24 +39,21 @@ def get_file(self, filename: str, directory: str = 'gcodes') -> str:
3839
3940
returns the file as a string
4041
"""
41-
url = f'{self._base_url}/rr_download'
42+
url = f'{self.base_url}/rr_download'
4243
r = requests.get(url, {'name': f'/{directory}/{filename}'})
4344
if not r.ok:
4445
raise ValueError
4546
return r.text
4647

47-
def upload_file(self, file: str, directory: str = 'gcodes') -> Dict:
48-
file = os.path.abspath(file).replace('\\', '/')
49-
filename = file.split('/')[-1]
50-
url = f'{self._base_url}/rr_upload?name=/{directory}/{filename}'
51-
with open(file, 'rb') as f:
52-
r = requests.post(url, data=f)
48+
def upload_file(self, file: Union[StringIO, TextIOWrapper], filename: str, directory: str = 'gcodes') -> Dict:
49+
url = f'{self.base_url}/rr_upload?name=/{directory}/{filename}'
50+
r = requests.post(url, data=file)
5351
if not r.ok:
5452
raise ValueError
5553
return r.json()
5654

5755
def get_fileinfo(self, filename: str = None, directory: str = 'gcodes') -> Dict:
58-
url = f'{self._base_url}/rr_fileinfo'
56+
url = f'{self.base_url}/rr_fileinfo'
5957
if filename:
6058
r = requests.get(url, {'name': f'/{directory}/{filename}'})
6159
else:
@@ -65,7 +63,7 @@ def get_fileinfo(self, filename: str = None, directory: str = 'gcodes') -> Dict:
6563
return r.json()
6664

6765
def delete_file(self, filename: str, directory: str = 'gcodes') -> Dict:
68-
url = f'{self._base_url}/rr_delete'
66+
url = f'{self.base_url}/rr_delete'
6967
r = requests.get(url, {'name': f'/{directory}/{filename}'})
7068
if not r.ok:
7169
raise ValueError
@@ -74,21 +72,21 @@ def delete_file(self, filename: str, directory: str = 'gcodes') -> Dict:
7472
def move_file(self, from_path, to_path, **_ignored):
7573
# BUG this doesn't work currently
7674
raise NotImplementedError
77-
url = f'{self._base_url}/rr_move'
75+
url = f'{self.base_url}/rr_move'
7876
r = requests.get(url, {'old': f'{from_path}', 'new': f'{to_path}'})
7977
if not r.ok:
8078
raise ValueError
8179
return r.json()
8280

8381
def get_directory(self, directory: str) -> List[Dict]:
84-
url = f'{self._base_url}/rr_filelist'
82+
url = f'{self.base_url}/rr_filelist'
8583
r = requests.get(url, {'dir': f'/{directory}'})
8684
if not r.ok:
8785
raise ValueError
8886
return r.json()['files']
8987

9088
def create_directory(self, directory: str) -> Dict:
91-
url = f'{self._base_url}/rr_mkdir'
89+
url = f'{self.base_url}/rr_mkdir'
9290
r = requests.get(url, {'dir': f'/{directory}'})
9391
if not r.ok:
9492
raise ValueError

examples.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
riley.send_code('M115')
1818
bruce.send_code('M115')
1919

20-
riley.upload_file('test.gcode')
21-
bruce.upload_file('test.gcode')
20+
with open('test.gcode', 'r') as f:
21+
riley.upload_file(f, 'test.gcode')
22+
bruce.upload_file(f, 'test.gcode')
2223

2324
riley.get_file('test.gcode')
2425
bruce.get_file('test.gcode')

requirements_dev.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
autopep8==1.5.4
22
bleach==3.2.1
3+
bumpversion
34
certifi==2020.6.20
45
chardet==3.0.4
56
colorama==0.4.4
@@ -22,3 +23,4 @@ tqdm==4.51.0
2223
twine==3.2.0
2324
urllib3==1.25.11
2425
webencodings==0.5.1
26+
wheel

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
setup(
1111
name="duetwebapi",
12-
version="1.1.2-b1",
12+
version="1.1.2-b3",
1313
include_package_data=True,
1414
packages=find_packages(),
1515

0 commit comments

Comments
 (0)