Skip to content

Commit de40f79

Browse files
authored
Merge pull request #14 from docentYT/development
v1.0.0
2 parents a6eb16c + 887e53e commit de40f79

File tree

11 files changed

+165
-46
lines changed

11 files changed

+165
-46
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.0.0]
9+
### Added
10+
- `to_xml()` method in `OsmChange`.
11+
- `upload()` method in `changeset` `endpoint` has new optional arguments.
12+
- Test for `to_xml()` method in `OsmChange`.
13+
- `# pragma: no cover` for unexpected api errors (Those that are not in the specification on the wiki).
14+
15+
### Changed
16+
- Private `_to_xml()` method in `OsmChange` is now static.
17+
818
## [0.4.2]
19+
920
### Changed
1021
- Order of elements in xml generated by `Way._to_xml()`. First tags, then nodes.
1122

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,4 @@ but it can consume large amounts of ram and use of this method is not recommende
132132
# Tests
133133

134134
You will need to install `test-requirements.txt`. You can use tox.
135-
To run tests manually use `python -m unittest discover`.
135+
To run tests manually use `python -m unittest discover`.

src/osm_easy_api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION = "0.4.2"
1+
VERSION = "1.0.0"
22

33
from .data_classes import *
44
from .diff import Diff, Frequency

src/osm_easy_api/api/endpoints/changeset.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def get(self, id: int, include_discussion: bool = False) -> Changeset:
114114
match status_code:
115115
case 200: pass
116116
case 404: raise exceptions.IdNotFoundError()
117-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
117+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
118118

119119
return self._xml_to_changeset(generator, include_discussion)[0] # type: ignore
120120

@@ -169,7 +169,7 @@ def get_query(self, left: float | None = None, bottom: float | None = None, righ
169169
case 200: pass
170170
case 400: raise ValueError("Invalid arguments. See https://wiki.openstreetmap.org/wiki/API_v0.6#Query:_GET_/api/0.6/changesets for more info.")
171171
case 404: raise exceptions.IdNotFoundError()
172-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
172+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
173173

174174
return self._xml_to_changeset(generator) # type: ignore
175175

@@ -217,7 +217,7 @@ def update(self, id: int, comment: str | None = None, tags: Tags | None = None)
217217
case 200: pass
218218
case 404: raise exceptions.IdNotFoundError()
219219
case 409: raise exceptions.ChangesetAlreadyClosedOrUserIsNotAnAuthor(response.text)
220-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
220+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
221221

222222
response.raw.decode_content = True
223223
return self._xml_to_changeset(self.outer._raw_stream_parser(response.raw), True)[0]
@@ -237,7 +237,7 @@ def close(self, id: int) -> None:
237237
case 200: pass
238238
case 404: raise exceptions.IdNotFoundError()
239239
case 409: raise exceptions.ChangesetAlreadyClosedOrUserIsNotAnAuthor(response.text)
240-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
240+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
241241

242242
def download(self, id: int) -> Generator[Tuple['Action', 'Node | Way | Relation'], None, None]:
243243
"""Download changes made in changeset. Like in 'diff' module.
@@ -256,7 +256,7 @@ def download(self, id: int) -> Generator[Tuple['Action', 'Node | Way | Relation'
256256
match stream.status_code:
257257
case 200: pass
258258
case 404: raise exceptions.IdNotFoundError()
259-
case _: assert False, f"Unexpected response status code {stream.status_code}. Please report it on github."
259+
case _: assert False, f"Unexpected response status code {stream.status_code}. Please report it on github." # pragma: no cover
260260

261261
stream.raw.decode_content = True
262262
def generator() -> Generator[tuple['Action', 'Node | Way | Relation'], None, None]:
@@ -267,13 +267,14 @@ def generator() -> Generator[tuple['Action', 'Node | Way | Relation'], None, Non
267267
yield (action, element) # type: ignore (We checked if it is Action)
268268
return generator()
269269

270-
def upload(self, changeset_id: int, osmChange: OsmChange):
270+
def upload(self, changeset_id: int, osmChange: OsmChange, make_osmChange_valid: bool = True, work_on_copy: bool = False):
271271
# TODO: Parse returned xml
272272
"""Upload OsmChange to OSM. You must provide changeset ID for open changeset.
273273
274274
Args:
275275
changeset_id (int): Open changeset ID.
276276
osmChange (OsmChange): OsmChange instance with changes you want to upload. Action cannot be empty!
277+
make_osmChange_valid (bool):
277278
278279
Raises:
279280
exceptions.ErrorWhenParsingXML: Incorrect OsmChange object. Maybe missing elements attributes.
@@ -285,7 +286,7 @@ def upload(self, changeset_id: int, osmChange: OsmChange):
285286
method=self.outer._RequestMethods.POST,
286287
url=self.outer._url.changeset["upload"].format(id=changeset_id),
287288
auth_requirement=self.outer._Requirement.YES,
288-
body = osmChange._to_xml(changeset_id),
289+
body = osmChange.to_xml(changeset_id, make_osmChange_valid, work_on_copy),
289290
auto_status_code_handling=False
290291
)
291292
match response.status_code:

src/osm_easy_api/api/endpoints/changeset_discussion.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def comment(self, changeset_id: int, text: str) -> None:
2323
match response.status_code:
2424
case 200: pass
2525
case 409: raise exceptions.ChangesetNotClosed()
26-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
26+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
2727

2828
def subscribe(self, changeset_id: int) -> None:
2929
"""Subscribe to the discussion to receive notifications for new comments.
@@ -39,7 +39,7 @@ def subscribe(self, changeset_id: int) -> None:
3939
match response.status_code:
4040
case 200: pass
4141
case 409: raise exceptions.AlreadySubscribed()
42-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
42+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
4343

4444
def unsubscribe(self, changeset_id: int) -> None:
4545
"""Unsubscribe from discussion to stop receiving notifications.
@@ -55,7 +55,7 @@ def unsubscribe(self, changeset_id: int) -> None:
5555
match response.status_code:
5656
case 200: pass
5757
case 404: raise exceptions.NotSubscribed()
58-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
58+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
5959

6060
def hide(self, comment_id: int) -> None:
6161
"""Set visible flag on changeset comment to false. MODERATOR ONLY!
@@ -73,7 +73,7 @@ def hide(self, comment_id: int) -> None:
7373
case 200: pass
7474
case 403: raise exceptions.NotAModerator()
7575
case 404: raise exceptions.IdNotFoundError()
76-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
76+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
7777

7878
def unhide(self, comment_id: int) -> None:
7979
"""Set visible flag on changeset comment to true. MODERATOR ONLY!
@@ -91,4 +91,4 @@ def unhide(self, comment_id: int) -> None:
9191
case 200: pass
9292
case 403: raise exceptions.NotAModerator()
9393
case 404: raise exceptions.IdNotFoundError()
94-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
94+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover

src/osm_easy_api/api/endpoints/elements.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def create(self, element: Node | Way | Relation, changeset_id: int) -> int:
4141
case 400: raise ValueError(response.content)
4242
case 409: raise exceptions.ChangesetAlreadyClosedOrUserIsNotAnAuthor(response.content)
4343
case 412: raise ValueError(response.content)
44-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
44+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
4545

4646
return int(response.text)
4747

@@ -70,7 +70,7 @@ def get(self, element: type[Node_Way_Relation], id: int) -> Node_Way_Relation :
7070
case 200: pass
7171
case 404: raise exceptions.IdNotFoundError()
7272
case 410: raise exceptions.ElementDeleted()
73-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
73+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
7474

7575
for event, elem in generator:
7676
if elem.tag in ("node", "way", "relation") and event == "start":
@@ -106,7 +106,7 @@ def update(self, element: Node | Way | Relation, changeset_id: int) -> int:
106106
case 409: raise ValueError(response.content)
107107
case 404: raise exceptions.IdNotFoundError()
108108
case 412: raise exceptions.IdNotFoundError(response.content)
109-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
109+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
110110
return int(response.content)
111111

112112
def delete(self, element: Node | Way | Relation, changeset_id: int) -> int:
@@ -138,7 +138,7 @@ def delete(self, element: Node | Way | Relation, changeset_id: int) -> int:
138138
case 409: raise exceptions.ChangesetAlreadyClosedOrUserIsNotAnAuthor(response.content)
139139
case 410: raise exceptions.ElementDeleted()
140140
case 412: raise ValueError(response.content)
141-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
141+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
142142
return int(response.content)
143143

144144
def history(self, element: type[Node_Way_Relation], id: int) -> list[Node_Way_Relation]:
@@ -164,7 +164,7 @@ def history(self, element: type[Node_Way_Relation], id: int) -> list[Node_Way_Re
164164
match status_code:
165165
case 200: pass
166166
case 404: raise exceptions.IdNotFoundError()
167-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
167+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
168168

169169
objects_list = []
170170
for event, elem in generator:
@@ -199,7 +199,7 @@ def version(self, element: type[Node_Way_Relation], id: int, version: int) -> No
199199
case 200: pass
200200
case 403: raise exceptions.IdNotFoundError("This version of the element is not available (due to redaction)")
201201
case 404: raise exceptions.IdNotFoundError()
202-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
202+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
203203

204204
for event, elem in generator:
205205
if elem.tag in ("node", "way", "relation"):
@@ -237,7 +237,7 @@ def get_query(self, element: type[Node_Way_Relation], ids: list[int]) -> list[No
237237
case 400: raise ValueError()
238238
case 404: raise exceptions.IdNotFoundError()
239239
case 414: raise ValueError("URL too long (too many ids)")
240-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
240+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
241241

242242
objects_list = []
243243
for event, elem in generator:
@@ -317,7 +317,7 @@ def full(self, element: type[Way_Relation], id: int) -> Way_Relation:
317317
case 200: pass
318318
case 404: raise exceptions.IdNotFoundError()
319319
case 410: raise exceptions.ElementDeleted()
320-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
320+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
321321

322322
nodes_dict: dict[int, Node] = {}
323323
ways_dict: dict[int, Way] = {}

src/osm_easy_api/api/endpoints/misc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def get_map_in_bbox(self, left: float, bottom: float, right: float, top: float)
9090
case 200: pass
9191
case 400: raise exceptions.LimitsExceeded("You are trying to download too much data.")
9292
case 509: raise exceptions.LimitsExceeded("You have downloaded too much data. Please try again later. See https://wiki.openstreetmap.org/wiki/Developer_FAQ#I've_been_blocked_from_the_API_for_downloading_too_much._Now_what?")
93-
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github."
93+
case _: assert False, f"Unexpected response status code {response.status_code}. Please report it on github." # pragma: no cover
9494

9595
response.raw.decode_content = True
9696
def generator():

src/osm_easy_api/api/endpoints/notes.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def get_bbox(self, left: str, bottom: str, right: str, top: str, limit: int = 10
110110
match status_code:
111111
case 200: pass
112112
case 400: raise ValueError("Limits exceeded")
113-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
113+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
114114

115115
return self._xml_to_note(generator)
116116

@@ -155,7 +155,7 @@ def comment(self, id: int, text: str) -> Note:
155155
case 200: pass
156156
case 404: raise exceptions.IdNotFoundError()
157157
case 409: raise exceptions.NoteAlreadyClosed()
158-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
158+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
159159

160160
return self._xml_to_note(generator)[0]
161161

@@ -185,7 +185,7 @@ def close(self, id: int, text: str | None = None) -> Note:
185185
case 200: pass
186186
case 404: raise exceptions.IdNotFoundError()
187187
case 409: raise exceptions.NoteAlreadyClosed()
188-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
188+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
189189

190190
return self._xml_to_note(generator)[0]
191191

@@ -216,7 +216,7 @@ def reopen(self, id: int, text: str | None = None) -> Note:
216216
case 404: raise exceptions.IdNotFoundError()
217217
case 409: raise exceptions.NoteAlreadyOpen()
218218
case 410: raise exceptions.ElementDeleted()
219-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
219+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
220220

221221
return self._xml_to_note(generator)[0]
222222

@@ -255,7 +255,7 @@ def search(self, text: str, limit: int = 100, closed_days: int = 7, user_id: int
255255
match status_code:
256256
case 200: pass
257257
case 400: raise ValueError("Limits exceeded")
258-
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github."
258+
case _: assert False, f"Unexpected response status code {status_code}. Please report it on github." # pragma: no cover
259259

260260
try:
261261
return self._xml_to_note(generator)

0 commit comments

Comments
 (0)