8000 tileset serialization and tests · pythonarcade/pytiled_parser@802c987 · GitHub
[go: up one dir, main page]

Skip to content

Commit 802c987

Browse files
committed
tileset serialization and tests
1 parent 5a75183 commit 802c987

File tree

3 files changed

+134
-2
lines changed

3 files changed

+134
-2
lines changed

pytiled_parser/parsers/json/tileset.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
from pytiled_parser.parsers.json.properties import serialize as serialize_properties
1313
from pytiled_parser.parsers.json.wang_set import RawWangSet
1414
from pytiled_parser.parsers.json.wang_set import parse as parse_wangset
15+
from pytiled_parser.parsers.json.wang_set import serialize as serialize_wangset
1516
from pytiled_parser.tileset import Frame, Grid, Tile, Tileset, Transformations
16-
from pytiled_parser.util import parse_color
17+
from pytiled_parser.util import parse_color, serialize_color
1718

1819
RawFrame = TypedDict("RawFrame", {"duration": int, "tileid": int})
1920
RawFrame.__doc__ = """
@@ -402,3 +403,75 @@ def parse(
402403
tileset.fill_mode = raw_tileset["fillmode"]
403404

404405
return tileset
406+
407+
408+
def serialize(tileset: Tileset) -> RawTileSet:
409+
raw_tileset: RawTileSet = {
410+
"name": tileset.name,
411+
"tilecount": tileset.tile_count,
412+
"tilewidth": tileset.tile_width,
413+
"tileheight": tileset.tile_height,
414+
"spacing": tileset.spacing,
415+
"margin": tileset.margin,
416+
"columns": tileset.columns
417+
}
418+
419+
if tileset.version is not None:
420+
raw_tileset["version"] = tileset.version
421+
422+
if tileset.tiled_version is not None:
423+
raw_tileset["tiledversion"] = tileset.tiled_version
424+
425+
if tileset.image is not None:
426+
# TODO: This is an absolute path, need to handle relative paths for serialization
427+
raw_tileset["image"] = str(tileset.image)
428+
429+
if tileset.image_width is not None:
430+
raw_tileset["imagewidth"] = tileset.image_width
431+
432+
if tileset.image_height is not None:
433+
raw_tileset["imageheight"] = tileset.image_height
434+
435+
if tileset.alignment is not None:
436+
raw_tileset["objectalignment"] = tileset.alignment
437+
438+
if tileset.background_color is not None:
439+
raw_tileset["backgroundcolor"] = serialize_color(tileset.background_color)
440+
441+
if tileset.tile_offset is not None:
442+
raw_tileset["tileoffset"] = _serialize_tile_offset(tileset.tile_offset)
443+
444+
if tileset.transparent_color is not None:
445+
raw_tileset["transparentcolor"] = serialize_color(tileset.transparent_color)
446+
447+
if tileset.grid is not None:
448+
raw_tileset["grid"] = _serialize_grid(tileset.grid)
449+
450+
if tileset.properties is not None:
451+
raw_tileset["properties"] = serialize_properties(tileset.properties)
452+
453+
if tileset.tiles is not None:
454+
tiles = []
455+
f 8000 or tile_id, tile in tileset.tiles.items():
456+
tiles.append(_serialize_tile(tile))
457+
raw_tileset["tiles"] = tiles
458+
459+
if tileset.transformations is not None:
460+
raw_tileset["transformations"] = _serialize_transformations(tileset.transformations)
461+
462+
if tileset.class_ is not None:
463+
raw_tileset["class"] = tileset.class_
464+
465+
if tileset.tile_render_size != "tile":
466+
raw_tileset["tilerendersize"] = tileset.tile_render_size
467+
468+
if tileset.fill_mode != "stretch":
469+
raw_tileset["fillmode"] = tileset.fill_mode
470+
471+
if tileset.wang_sets is not None:
472+
raw_wang_sets = []
473+
for wang_set in tileset.wang_sets:
474+
raw_wang_sets.append(serialize_wangset(wang_set))
475+
raw_tileset["wangsets"] = raw_wang_sets
476+
477+
return raw_tileset

pytiled_parser/parsers/json/wang_set.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
from pytiled_parser.parsers.json.properties import RawProperty
66
from pytiled_parser.parsers.json.properties import parse as parse_properties
7-
from pytiled_parser.util import parse_color
7+
from pytiled_parser.parsers.json.properties import serialize as serialize_properties
8+
from pytiled_parser.util import parse_color, serialize_color
89
from pytiled_parser.wang_set import WangColor, WangSet, WangTile
910

1011
RawWangTile = TypedDict(
@@ -66,6 +67,10 @@ def _parse_wang_tile(raw_wang_tile: RawWangTile) -> WangTile:
6667
return WangTile(tile_id=raw_wang_tile["tileid"], wang_id=raw_wang_tile["wangid"])
6768

6869

70+
def _serialize_wang_tile(wang_tile: WangTile) -> RawWangTile:
71+
return {"tileid": wang_tile.tile_id, "wangid": wang_tile.wang_id}
72+
73+
6974
def _parse_wang_color(raw_wang_color: RawWangColor) -> WangColor:
7075
"""Parse the raw wang color into a pytiled_parser type
7176
@@ -88,6 +93,19 @@ def _parse_wang_color(raw_wang_color: RawWangColor) -> WangColor:
8893
return wang_color
8994

9095

96+
def _serialize_wang_color(wang_color: WangColor) -> RawWangColor:
97+
raw_wang_color: RawWangColor = {
98+
"name": wang_color.name,
99+
"color": serialize_color(wang_color.color),
100+
"tile": wang_color.tile,
101+
"probability": wang_color.probability
102+
}
103+
104+
if wang_color.properties is not None:
105+
raw_wang_color["properties"] = serialize_properties(wang_color.properties)
106+
107+
return raw_wang_color
108+
91109
def parse(raw_wangset: RawWangSet) -> WangSet:
92110
"""Parse the raw wangset into a pytiled_parser type
93111
@@ -118,3 +136,26 @@ def parse(raw_wangset: RawWangSet) -> WangSet:
118136
wangset.properties = parse_properties(raw_wangset["properties"])
119137

120138
return wangset
139+
140+
141+
def serialize(wangset: WangSet) -> RawWangSet:
142+
colors = []
143+
for wang_color in wangset.wang_colors:
144+
colors.append(_serialize_wang_color(wang_color))
145+
146+
tiles = []
147+
for tile_id, wang_tile in wangset.wang_tiles.items():
148+
tiles.append(_serialize_wang_tile(wang_tile))
149+
150+
raw_wangset: RawWangSet = {
151+
"name": wangset.name,
152+
"tile": wangset.tile,
153+
"type": wangset.wang_type,
154+
"colors": colors,
155+
"wangtiles": tiles
156+
}
157+
158+
if wangset.properties is not None:
159+
raw_wangset["properties"] = serialize_properties(wangset.properties)
160+
161+
return raw_wangset

tests/test_tileset.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from pytiled_parser import parse_tileset
1111
from pytiled_parser.common_types import OrderedPair, Size
1212
from pytiled_parser.parsers.json.tileset import parse as parse_json
13+
from pytiled_parser.parsers.json.tileset import serialize as serialize_json
1314
from pytiled_parser.parsers.tmx.tileset import parse as parse_tmx
1415

1516
TESTS_DIR = Path(os.path.dirname(os.path.abspath(__file__)))
@@ -78,3 +79,20 @@ def test_tilesets_integration(parser_type, tileset_dir):
7879
fix_tileset(expected.EXPECTED)
7980

8081
assert tileset_ == expected.EXPECTED
82+
83+
@pytest.mark.parametrize("tileset_dir", ALL_TILESET_DIRS)
84+
def test_tilesets_serialization(tileset_dir):
85+
spec = importlib.util.spec_from_file_location(
86+
"expected", tileset_dir / "expected.py"
87+
)
88+
expected = importlib.util.module_from_spec(spec)
89+
spec.loader.exec_module(expected)
90+
91+
raw_tileset = serialize_json(expected.EXPECTED)
92+
# Use a firstgid of 1, since these aren't actually in a map
93+
parsed = parse_json(raw_tileset, 1)
94+
95+
fix_tileset(parsed)
96+
fix_tileset(expected.EXPECTED)
97+
98+
assert parsed == expected.EXPECTED

0 commit comments

Comments
 (0)
0