Skip to content

Commit 1e258ce

Browse files
authored
Merge pull request #3 from AndyEveritt/dev-1.1.2-b0
Dev 1.1.2 b0
2 parents 2e0569a + 025628d commit 1e258ce

10 files changed

Lines changed: 80 additions & 45 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.1
2+
current_version = 1.1.2
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.1"
1+
__version__ = "1.1.2"
22

33
from .dwa_factory import DuetWebAPI

duetwebapi/api/base.py

Lines changed: 19 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,26 @@ 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 = value
23+
24+
def connect(self, **kwargs):
25+
""" Start connection to Duet """
26+
raise NotImplementedError
27+
28+
def disconnect(self):
29+
""" End connection to Duet """
30+
raise NotImplementedError
31+
1832
def get_model(self, key: str = None) -> Dict:
1933
""" Get Duet object model. RRF3 only """
2034
raise NotImplementedError
@@ -27,7 +41,7 @@ def get_file(self, filename: str, directory: str = 'gcodes') -> str:
2741
""" Get file from Duet """
2842
raise NotImplementedError
2943

30-
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:
3145
""" Upload file to Duet """
3246
raise NotImplementedError
3347

@@ -50,5 +64,3 @@ def get_directory(self, directory: str) -> List[Dict]:
5064
def create_directory(self, directory: str) -> Dict:
5165
""" Create a new directory """
5266
raise NotImplementedError
53-
54-
pass

duetwebapi/api/dsf_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,13 +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)
2223
j = r.json()
2324
return j
2425

2526
def send_code(self, code: str) -> Dict:
26-
url = f'{self._base_url}/machine/code'
27+
url = f'{self.base_url}/machine/code'
2728
r = requests.post(url, data=code)
2829
return {'response': r.text}
2930

@@ -34,58 +35,55 @@ def get_file(self, filename: str, directory: str = 'gcodes') -> str:
3435
3536
returns the file as a string
3637
"""
37-
url = f'{self._base_url}/machine/file/{directory}/{filename}'
38+
url = f'{self.base_url}/machine/file/{directory}/{filename}'
3839
r = requests.get(url)
3940
if not r.ok:
4041
raise ValueError
4142
return r.text
4243

43-
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:
4445
"""
4546
file: the path to the file you want to upload from your PC
4647
directory: the folder that the file is in, options are ['gcodes', 'macros', 'sys']
4748
4849
returns the file as a string
4950
"""
50-
file = os.path.abspath(file).replace('\\', '/')
51-
filename = file.split('/')[-1]
52-
url = f'{self._base_url}/machine/file/{directory}/{filename}'
53-
with open(file, 'rb') as f:
54-
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'})
5553
if not r.ok:
5654
raise ValueError
5755
return {'err': 0}
5856

5957
def get_fileinfo(self, filename: str = None, directory: str = 'gcodes') -> Dict:
60-
url = f'{self._base_url}/machine/fileinfo/{directory}/{filename}'
58+
url = f'{self.base_url}/machine/fileinfo/{directory}/{filename}'
6159
r = requests.get(url)
6260
if not r.ok:
6361
raise ValueError
6462
return r.json()
6563

6664
def delete_file(self, filename: str, directory: str = 'gcodes') -> Dict:
67-
url = f'{self._base_url}/machine/file/{directory}/{filename}'
65+
url = f'{self.base_url}/machine/file/{directory}/{filename}'
6866
r = requests.delete(url)
6967
if not r.ok:
7068
raise ValueError
7169
return {'err': 0}
7270

7371
def move_file(self, from_path: str, to_path: str, force: bool = False) -> Dict:
74-
url = f'{self._base_url}/machine/file/move'
72+
url = f'{self.base_url}/machine/file/move'
7573
r = requests.post(url, {'from': f'{from_path}', 'to': f'{to_path}', 'force': force})
7674
if not r.ok:
7775
raise ValueError
7876
return {'err': 0}
7977

8078
def get_directory(self, directory: str) -> List[Dict]:
81-
url = f'{self._base_url}/machine/directory/{directory}'
79+
url = f'{self.base_url}/machine/directory/{directory}'
8280
r = requests.get(url)
8381
if not r.ok:
8482
raise ValueError
8583
return r.json()
8684

8785
def create_directory(self, directory: str) -> Dict:
88-
url = f'{self._base_url}/machine/directory/{directory}'
86+
url = f'{self.base_url}/machine/directory/{directory}'
8987
r = requests.put(url)
9088
if not r.ok:
9189
raise ValueError

duetwebapi/api/dwc_api.py

Lines changed: 38 additions & 16 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

@@ -16,20 +17,44 @@ class DWCAPI(DuetAPI):
1617
"""
1718
api_name = 'DWC_REST'
1819

20+
def connect(self, password=''):
21+
""" Start connection to Duet """
22+
url = f'{self.base_url}/rr_connect'
23+
r = requests.get(url, {'password': password})
24+
if not r.ok:
25+
raise ValueError
26+
return r.json()
27+
28+
def disconnect(self):
29+
""" End connection to Duet """
30+
url = f'{self.base_url}/rr_disconnect'
31+
r = requests.get(url)
32+
if not r.ok:
33+
raise ValueError
34+
return r.json()
35+
1936
def get_model(self, key: str = None) -> Dict:
20-
url = f'{self._base_url}/rr_model'
37+
url = f'{self.base_url}/rr_model'
2138
r = requests.get(url, {'flags': 'd99vn', 'key': key})
2239
if not r.ok:
2340
raise ValueError
2441
j = r.json()
2542
return j['result']
2643

44+
def _get_reply(self) -> Dict:
45+
url = f'{self.base_url}/rr_reply'
46+
r = requests.get(url)
47+
if not r.ok:
48+
raise ValueError
49+
return r.text
50+
2751
def send_code(self, code: str) -> Dict:
28-
url = f'{self._base_url}/rr_gcode'
52+
url = f'{self.base_url}/rr_gcode'
2953
r = requests.get(url, {'gcode': code})
3054
if not r.ok:
3155
raise ValueError
32-
return {'response': ''}
56+
reply = self._get_reply()
57+
return {'response': reply}
3358

3459
def get_file(self, filename: str, directory: str = 'gcodes') -> str:
3560
"""
@@ -38,24 +63,21 @@ def get_file(self, filename: str, directory: str = 'gcodes') -> str:
3863
3964
returns the file as a string
4065
"""
41-
url = f'{self._base_url}/rr_download'
66+
url = f'{self.base_url}/rr_download'
4267
r = requests.get(url, {'name': f'/{directory}/{filename}'})
4368
if not r.ok:
4469
raise ValueError
4570
return r.text
4671

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)
72+
def upload_file(self, file: Union[StringIO, TextIOWrapper], filename: str, directory: str = 'gcodes') -> Dict:
73+
url = f'{self.base_url}/rr_upload?name=/{directory}/{filename}'
74+
r = requests.post(url, data=file)
5375
if not r.ok:
5476
raise ValueError
5577
return r.json()
5678

5779
def get_fileinfo(self, filename: str = None, directory: str = 'gcodes') -> Dict:
58-
url = f'{self._base_url}/rr_fileinfo'
80+
url = f'{self.base_url}/rr_fileinfo'
5981
if filename:
6082
r = requests.get(url, {'name': f'/{directory}/{filename}'})
6183
else:
@@ -65,7 +87,7 @@ def get_fileinfo(self, filename: str = None, directory: str = 'gcodes') -> Dict:
6587
return r.json()
6688

6789
def delete_file(self, filename: str, directory: str = 'gcodes') -> Dict:
68-
url = f'{self._base_url}/rr_delete'
90+
url = f'{self.base_url}/rr_delete'
6991
r = requests.get(url, {'name': f'/{directory}/{filename}'})
7092
if not r.ok:
7193
raise ValueError
@@ -74,21 +96,21 @@ def delete_file(self, filename: str, directory: str = 'gcodes') -> Dict:
7496
def move_file(self, from_path, to_path, **_ignored):
7597
# BUG this doesn't work currently
7698
raise NotImplementedError
77-
url = f'{self._base_url}/rr_move'
99+
url = f'{self.base_url}/rr_move'
78100
r = requests.get(url, {'old': f'{from_path}', 'new': f'{to_path}'})
79101
if not r.ok:
80102
raise ValueError
81103
return r.json()
82104

83105
def get_directory(self, directory: str) -> List[Dict]:
84-
url = f'{self._base_url}/rr_filelist'
106+
url = f'{self.base_url}/rr_filelist'
85107
r = requests.get(url, {'dir': f'/{directory}'})
86108
if not r.ok:
87109
raise ValueError
88110
return r.json()['files']
89111

90112
def create_directory(self, directory: str) -> Dict:
91-
url = f'{self._base_url}/rr_mkdir'
113+
url = f'{self.base_url}/rr_mkdir'
92114
r = requests.get(url, {'dir': f'/{directory}'})
93115
if not r.ok:
94116
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.1",
12+
version="1.1.2",
1313
include_package_data=True,
1414
packages=find_packages(),
1515

0 commit comments

Comments
 (0)