diff --git a/.gitignore b/.gitignore index 1f9df50..16c032d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,111 +1,114 @@ -# Tiled Session file from using a project file -*.tiled-session - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.idea/ - -# VS Code Directory +# Tiled Session file from using a project file +*.tiled-session + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.idea/ + +# ruff +.ruff_cache + +# VS Code Directory .vscode \ No newline at end of file diff --git a/pytiled_parser/parsers/tmx/tiled_object.py b/pytiled_parser/parsers/tmx/tiled_object.py index 8f9fb17..711664e 100644 --- a/pytiled_parser/parsers/tmx/tiled_object.py +++ b/pytiled_parser/parsers/tmx/tiled_object.py @@ -272,14 +272,14 @@ def parse(raw_object: etree.Element, parent_dir: Optional[Path] = None) -> Tiled if isinstance(template, etree.Element): new_object = template.find("./object") if new_object is not None: - if raw_object.attrib.get("id") is not None: - new_object.attrib["id"] = raw_object.attrib["id"] + for key, val in raw_object.attrib.items(): + if key == "template": + continue + new_object.attrib[key] = val - if raw_object.attrib.get("x") is not None: - new_object.attrib["x"] = raw_object.attrib["x"] - - if raw_object.attrib.get("y") is not None: - new_object.attrib["y"] = raw_object.attrib["y"] + properties_element = raw_object.find("./properties") + if properties_element is not None: + new_object.append(properties_element) raw_object = new_object elif isinstance(template, dict): diff --git a/tests/test_data/map_tests/template/expected.py b/tests/test_data/map_tests/template/expected.py index a6c7aad..5789bac 100644 --- a/tests/test_data/map_tests/template/expected.py +++ b/tests/test_data/map_tests/template/expected.py @@ -1,130 +1,131 @@ -from pathlib import Path - -from pytiled_parser import common_types, layer, tiled_map, tiled_object, tileset - -EXPECTED = tiled_map.TiledMap( - infinite=False, - layers=[ - layer.ObjectLayer( - name="Object Layer 1", - opacity=1, - visible=True, - id=2, - draw_order="topdown", - tiled_objects=[ - tiled_object.Rectangle( - id=2, - name="", - rotation=0, - size=common_types.Size(63.6585878103079, 38.2811778048473), - coordinates=common_types.OrderedPair( - 98.4987608686521, 46.2385012811358 - ), - visible=True, - class_="", - ), - tiled_object.Tile( - id=6, - coordinates=common_types.OrderedPair(46, 136.666666666667), - name="", - rotation=0, - class_="", - visible=True, - size=common_types.Size(32, 32), - gid=49, - ), - tiled_object.Tile( - id=7, - coordinates=common_types.OrderedPair(141.333333333333, 148), - name="", - rotation=0, - class_="", - visible=True, - size=common_types.Size(32, 32), - gid=50, - ), - ], - ) - ], - map_size=common_types.Size(8, 6), - next_layer_id=3, - next_object_id=8, - orientation="orthogonal", - render_order="right-down", - tiled_version="1.7.1", - tile_size=common_types.Size(32, 32), - version="1.6", - background_color=common_types.Color(255, 0, 4, 255), - tilesets={ - 1: tileset.Tileset( - columns=8, - image=Path(Path(__file__).parent / "../../images/tmw_desert_spacing.png") - .absolute() - .resolve(), - image_width=265, - image_height=199, - firstgid=1, - margin=1, - spacing=1, - name="tile_set_image", - tile_count=48, - tiled_version="1.6.0", - tile_height=32, - tile_width=32, - version="1.6", - type="tileset", - ), - 49: tileset.Tileset( - columns=1, - image=Path(Path(__file__).parent / "../../images/tile_04.png") - .absolute() - .resolve(), - image_width=32, - image_height=32, - firstgid=49, - margin=0, - spacing=0, - name="tile_set_image_for_template", - tile_count=1, - tiled_version="1.7.1", - tile_height=32, - tile_width=32, - version="1.6", - type="tileset", - ), - 50: tileset.Tileset( - columns=0, - margin=0, - spacing=0, - name="tile_set_single_image", - grid=tileset.Grid(orientation="orthogonal", width=1, height=1), - tiles={ - 0: tileset.Tile( - id=0, - image=Path(Path(__file__).parent / "../../images/tile_02.png") - .absolute() - .resolve(), - image_height=32, - image_width=32, - width=32, - height=32 - ) - }, - tile_count=1, - tiled_version="1.7.1", - tile_height=32, - tile_width=32, - firstgid=50, - type="tileset", - version="1.6", - ), - }, - properties={ - "bool property - true": True, - "color property": common_types.Color(73, 252, 255, 255), - "file property": Path("../../../../../../var/log/syslog"), - "float property": 1.23456789, - "int property": 13, - "string property": "Hello, World!!", - }, -) +from pathlib import Path + +from pytiled_parser import common_types, layer, tiled_map, tiled_object, tileset + +EXPECTED = tiled_map.TiledMap( + infinite=False, + layers=[ + layer.ObjectLayer( + name="Object Layer 1", + opacity=1, + visible=True, + id=2, + draw_order="topdown", + tiled_objects=[ + tiled_object.Rectangle( + id=2, + name="", + rotation=0, + size=common_types.Size(63.6585878103079, 38.2811778048473), + coordinates=common_types.OrderedPair( + 98.4987608686521, 46.2385012811358 + ), + properties={"test": "hello"}, + visible=True, + class_="", + ), + tiled_object.Tile( + id=6, + coordinates=common_types.OrderedPair(46, 136.666666666667), + name="", + rotation=0, + class_="", + visible=True, + size=common_types.Size(32, 32), + gid=49, + ), + tiled_object.Tile( + id=7, + coordinates=common_types.OrderedPair(141.333333333333, 148), + name="", + rotation=0, + class_="", + visible=True, + size=common_types.Size(32, 32), + gid=50, + ), + ], + ) + ], + map_size=common_types.Size(8, 6), + next_layer_id=3, + next_object_id=8, + orientation="orthogonal", + render_order="right-down", + tiled_version="1.9.2", + tile_size=common_types.Size(32, 32), + version="1.9", + background_color=common_types.Color(255, 0, 4, 255), + tilesets={ + 1: tileset.Tileset( + columns=8, + image=Path(Path(__file__).parent / "../../images/tmw_desert_spacing.png") + .absolute() + .resolve(), + image_width=265, + image_height=199, + firstgid=1, + margin=1, + spacing=1, + name="tile_set_image", + tile_count=48, + tiled_version="1.6.0", + tile_height=32, + tile_width=32, + version="1.6", + type="tileset", + ), + 49: tileset.Tileset( + columns=1, + image=Path(Path(__file__).parent / "../../images/tile_04.png") + .absolute() + .resolve(), + image_width=32, + image_height=32, + firstgid=49, + margin=0, + spacing=0, + name="tile_set_image_for_template", + tile_count=1, + tiled_version="1.7.1", + tile_height=32, + tile_width=32, + version="1.6", + type="tileset", + ), + 50: tileset.Tileset( + columns=0, + margin=0, + spacing=0, + name="tile_set_single_image", + grid=tileset.Grid(orientation="orthogonal", width=1, height=1), + tiles={ + 0: tileset.Tile( + id=0, + image=Path(Path(__file__).parent / "../../images/tile_02.png") + .absolute() + .resolve(), + image_height=32, + image_width=32, + width=32, + height=32, + ) + }, + tile_count=1, + tiled_version="1.7.1", + tile_height=32, + tile_width=32, + firstgid=50, + type="tileset", + version="1.6", + ), + }, + properties={ + "bool property - true": True, + "color property": common_types.Color(73, 252, 255, 255), + "file property": Path("../../../../../../var/log/syslog"), + "float property": 1.23456789, + "int property": 13, + "string property": "Hello, World!!", + }, +) diff --git a/tests/test_data/map_tests/template/map.json b/tests/test_data/map_tests/template/map.json index c578be3..b372362 100644 --- a/tests/test_data/map_tests/template/map.json +++ b/tests/test_data/map_tests/template/map.json @@ -1,85 +1,91 @@ -{ "backgroundcolor":"#ff0004", - "compressionlevel":0, - "height":6, - "infinite":false, - "layers":[ - { - "draworder":"topdown", - "id":2, - "name":"Object Layer 1", - "objects":[ - { - "id":2, - "template":"template-rectangle.json", - "x":98.4987608686521, - "y":46.2385012811358 - }, - { - "id":6, - "template":"template-tile-spritesheet.json", - "x":46, - "y":136.666666666667 - }, - { - "id":7, - "template":"template-tile-image.json", - "x":141.333333333333, - "y":148 - }], - "opacity":1, - "type":"objectgroup", - "visible":true, - "x":0, - "y":0 - }], - "nextlayerid":3, - "nextobjectid":8, - "orientation":"orthogonal", - "properties":[ - { - "name":"bool property - true", - "type":"bool", - "value":true - }, - { - "name":"color property", - "type":"color", - "value":"#ff49fcff" - }, - { - "name":"file property", - "type":"file", - "value":"..\/..\/..\/..\/..\/..\/var\/log\/syslog" - }, - { - "name":"float property", - "type":"float", - "value":1.23456789 - }, - { - "name":"int property", - "type":"int", - "value":13 - }, - { - "name":"string property", - "type":"string", - "value":"Hello, World!!" - }], - "renderorder":"right-down", - "tiledversion":"1.9.0", - "tileheight":32, - "tilesets":[ - { - "firstgid":1, - "source":"tileset.json" - }, - { - "firstgid":49, - "source":"tile_set_image_for_template.json" - }], - "tilewidth":32, - "type":"map", - "version":"1.9", - "width":8 +{ "backgroundcolor":"#ff0004", + "compressionlevel":0, + "height":6, + "infinite":false, + "layers":[ + { + "draworder":"topdown", + "id":2, + "name":"Object Layer 1", + "objects":[ + { + "id":2, + "properties":[ + { + "name":"test", + "type":"string", + "value":"hello" + }], + "template":"template-rectangle.json", + "x":98.4987608686521, + "y":46.2385012811358 + }, + { + "id":6, + "template":"template-tile-spritesheet.json", + "x":46, + "y":136.666666666667 + }, + { + "id":7, + "template":"template-tile-image.json", + "x":141.333333333333, + "y":148 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":8, + "orientation":"orthogonal", + "properties":[ + { + "name":"bool property - true", + "type":"bool", + "value":true + }, + { + "name":"color property", + "type":"color", + "value":"#ff49fcff" + }, + { + "name":"file property", + "type":"file", + "value":"..\/..\/..\/..\/..\/..\/var\/log\/syslog" + }, + { + "name":"float property", + "type":"float", + "value":1.23456789 + }, + { + "name":"int property", + "type":"int", + "value":13 + }, + { + "name":"string property", + "type":"string", + "value":"Hello, World!!" + }], + "renderorder":"right-down", + "tiledversion":"1.9.2", + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "source":"tileset.json" + }, + { + "firstgid":49, + "source":"tile_set_image_for_template.json" + }], + "tilewidth":32, + "type":"map", + "version":"1.9", + "width":8 } \ No newline at end of file diff --git a/tests/test_data/map_tests/template/map.tmx b/tests/test_data/map_tests/template/map.tmx index 255e0d1..b213899 100644 --- a/tests/test_data/map_tests/template/map.tmx +++ b/tests/test_data/map_tests/template/map.tmx @@ -1,18 +1,22 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +