Skip to content

Commit 7cef03e

Browse files
committed
Fix map_name in JSON plugin and add some fields
Change map to map_name in JSON output Add a few relevant fields to JSON output Complete the plugin test Restore a bit of PEP-8 in test_all and replay
1 parent fd0caa8 commit 7cef03e

File tree

2 files changed

+95
-47
lines changed

2 files changed

+95
-47
lines changed

sc2reader/plugins/replay.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22
from __future__ import absolute_import
33

44
import json
5-
import functools
65
from collections import defaultdict
76

87
from sc2reader import log_utils
98
from sc2reader.utils import Length
109
from sc2reader.plugins.utils import PlayerSelection, GameState, JSONDateEncoder, plugin
1110

11+
1212
@plugin
1313
def toJSON(replay, **user_options):
1414
options = dict(cls=JSONDateEncoder)
1515
options.update(user_options)
1616
return json.dumps(toDict()(replay), **options)
1717

18+
1819
@plugin
1920
def toDict(replay):
2021
# Build observers into dictionary
@@ -46,6 +47,7 @@ def toDict(replay):
4647
players.append({
4748
'avg_apm': getattr(player, 'avg_apm', None),
4849
'color': player.color.__dict__ if hasattr(player, 'color') else None,
50+
'handicap': getattr(player, 'handicap', None),
4951
'name': getattr(player, 'name', None),
5052
'pick_race': getattr(player, 'pick_race', None),
5153
'pid': getattr(player, 'pid', None),
@@ -60,8 +62,9 @@ def toDict(replay):
6062
# Consolidate replay metadata into dictionary
6163
return {
6264
'gateway': getattr(replay, 'gateway', None),
63-
'map': getattr(replay, 'map', None),
65+
'map_name': getattr(replay, 'map_name', None),
6466
'file_time': getattr(replay, 'file_time', None),
67+
'filehash': getattr(replay, 'filehash', None),
6568
'unix_timestamp': getattr(replay, 'unix_timestamp', None),
6669
'date': getattr(replay, 'date', None),
6770
'utc_date': getattr(replay, 'utc_date', None),
@@ -75,9 +78,14 @@ def toDict(replay):
7578
'frames': getattr(replay, 'frames', None),
7679
'build': getattr(replay, 'build', None),
7780
'release': getattr(replay, 'release_string', None),
78-
'length': getattr(getattr(replay, 'length', None),'seconds', None),
81+
'game_fps': getattr(replay, 'game_fps', None),
82+
'game_length': getattr(getattr(replay, 'game_length', None), 'seconds', None),
7983
'players': players,
80-
'observers': observers
84+
'observers': observers,
85+
'real_length': getattr(getattr(replay, 'real_length', None), 'seconds', None),
86+
'real_type': getattr(replay, 'real_type', None),
87+
'time_zone': getattr(replay, 'time_zone', None),
88+
'versions': getattr(replay, 'versions', None)
8189
}
8290

8391
@plugin

test_replays/test_all.py

Lines changed: 83 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,36 @@
11
# Encoding: UTF-8
22

33
# Run tests with "py.test" in the project root dir
4-
import os, sys
4+
import os
5+
import sys
56
import pytest
67
import datetime
8+
import json
79

8-
sys.path.insert(0, os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../")))
10+
root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../")
11+
sys.path.insert(0, os.path.normpath(root_dir))
912

1013
import sc2reader
11-
from sc2reader.exceptions import ParseError
1214
from sc2reader.plugins.replay import APMTracker, SelectionTracker, toJSON
1315

14-
sc2reader.log_utils.log_to_console('INFO')
16+
sc2reader.log_utils.log_to_console("INFO")
17+
1518

1619
def test_standard_1v1():
1720
replay = sc2reader.load_replay("test_replays/1.2.2.17811/1.SC2Replay")
1821

19-
assert replay.expansion == 'WoL'
22+
assert replay.expansion == "WoL"
2023
assert str(replay.length) == "32.47"
24+
assert str(replay.game_length) == "32.47"
25+
assert str(replay.real_length) == "23.25"
2126
assert replay.map_name == "Lost Temple"
2227
assert replay.build == 17811
2328
assert replay.release_string == "1.2.2.17811"
2429
assert replay.speed == "Faster"
2530
assert replay.type == "1v1"
2631

27-
assert replay.is_ladder == True
28-
assert replay.is_private == False
32+
assert replay.is_ladder is True
33+
assert replay.is_private is False
2934

3035
assert len(replay.players) == 2
3136
assert replay.person[1].name == "Emperor"
@@ -34,16 +39,16 @@ def test_standard_1v1():
3439
assert emperor.team.number == 1
3540
assert emperor.pick_race == "Protoss"
3641
assert emperor.play_race == "Protoss"
37-
assert emperor.recorder == False
42+
assert emperor.recorder is False
3843

3944
boom = replay.person[2]
4045
assert boom.team.number == 2
4146
assert boom.pick_race == "Terran"
4247
assert boom.play_race == "Terran"
43-
assert boom.recorder == True
48+
assert boom.recorder is True
4449

4550
for player in replay.players:
46-
assert player.is_human == True
51+
assert player.is_human is True
4752

4853
# Because it is a 1v1 and the recording player quit, we should know the winner.
4954
assert emperor.result == "Win"
@@ -79,70 +84,79 @@ def test_standard_1v1():
7984
assert replay.messages[11].player.name == "Boom"
8085

8186
for msg in replay.messages:
82-
assert msg.to_all == True
87+
assert msg.to_all is True
88+
8389

8490
def test_private_category():
8591
replay = sc2reader.load_replay("test_replays/1.2.2.17811/2.SC2Replay")
86-
assert replay.expansion == 'WoL'
92+
assert replay.expansion == "WoL"
8793
assert replay.is_private == True
8894
assert replay.is_ladder == False
8995

9096
def test_3v3():
9197
replay = sc2reader.load_replay("test_replays/1.2.2.17811/3.SC2Replay")
9298
assert replay.type == "3v3"
9399

94-
# Because it's a 3v3 and all of the members of Team 2 quit, we should know the winner.
100+
# Because it"s a 3v3 and all of the members of Team 2 quit, we should know the winner.
95101
assert replay.team[1].result == "Win"
96102
assert replay.team[2].result == "Loss"
97103

104+
98105
def test_4v4():
99106
replay = sc2reader.load_replay("test_replays/1.2.0.17326/9.SC2Replay")
100107
assert replay.type == "4v4"
101108

109+
102110
def test_2v2():
103111
replay = sc2reader.load_replay("test_replays/1.2.2.17811/7.SC2Replay")
104112
assert replay.type == "2v2"
105113

114+
106115
def test_ffa():
107116
replay = sc2reader.load_replay("test_replays/1.2.2.17811/8.SC2Replay")
108117
assert replay.type == "FFA"
109118

110-
assert replay.winner.players[0].name == 'Boom'
119+
assert replay.winner.players[0].name == "Boom"
120+
111121

112122
def test_unknown_winner():
113123
replay = sc2reader.load_replay("test_replays/1.2.2.17811/10.SC2Replay")
114124

115-
# Recording player (Boom) left second in a 4v4, so the winner shouldn't be known
116-
assert replay.winner == None
125+
# Recording player (Boom) left second in a 4v4, so the winner shouldn"t be known
126+
assert replay.winner is None
127+
117128

118129
def test_random_player():
119130
replay = sc2reader.load_replay("test_replays/1.2.2.17811/3.SC2Replay")
120131

121-
gogeta = next(player for player in replay.players if player.name == 'Gogeta')
132+
gogeta = next(player for player in replay.players if player.name == "Gogeta")
122133
assert gogeta.pick_race == "Random"
123134
assert gogeta.play_race == "Terran"
124135

136+
125137
def test_random_player2():
126138
replay = sc2reader.load_replay("test_replays/1.2.2.17811/6.SC2Replay")
127-
permafrost = next(player for player in replay.players if player.name == 'Permafrost')
139+
permafrost = next(player for player in replay.players if player.name == "Permafrost")
128140
assert permafrost.pick_race == "Random"
129141
assert permafrost.play_race == "Protoss"
130142

143+
131144
def test_us_realm():
132145
replay = sc2reader.load_replay("test_replays/1.2.2.17811/5.SC2Replay")
133-
shadesofgray = next(player for player in replay.players if player.name == 'ShadesofGray')
134-
reddawn = next(player for player in replay.players if player.name == 'reddawn')
146+
shadesofgray = next(player for player in replay.players if player.name == "ShadesofGray")
147+
reddawn = next(player for player in replay.players if player.name == "reddawn")
135148
assert shadesofgray.url == "http://us.battle.net/sc2/en/profile/2358439/1/ShadesofGray/"
136149
assert reddawn.url == "http://us.battle.net/sc2/en/profile/2198663/1/reddawn/"
137150

151+
138152
# TODO: Current problem.. both players are set as the recording players
139153
# Waiting for response https://github.com/arkx/mpyq/issues/closed#issue/7
140154
def test_kr_realm_and_tampered_messages():
141155
replay = sc2reader.load_replay("test_replays/1.1.3.16939/11.SC2Replay")
142-
assert replay.expansion == 'WoL'
156+
assert replay.expansion == "WoL"
143157

144-
first = next(player for player in replay.players if player.name == '명지대학교')
145-
second = next(player for player in replay.players if player.name == '티에스엘사기수')
158+
first = next(player for player in replay.players if player.name == "명지대학교")
159+
second = next(player for player in replay.players if player.name == "티에스엘사기수")
146160

147161
assert first.url == "http://kr.battle.net/sc2/en/profile/258945/1/명지대학교/"
148162
assert second.url == "http://kr.battle.net/sc2/en/profile/102472/1/티에스엘사기수/"
@@ -156,19 +170,23 @@ def test_kr_realm_and_tampered_messages():
156170
print replay.players[0].pick_race
157171
print replay.players[0].play_race
158172

159-
print replay.map
173+
print replay.map_name
174+
160175

161176
# TODO: Failing with
162177
# TypeError: Unknown event: 0x4 - 0xe3 at 16
163178
def test_referee():
164179
replay = sc2reader.load_replay("test_replays/1.2.2.17811/14.SC2Replay")
165180

181+
166182
def test_encrypted():
167183
replay = sc2reader.load_replay("test_replays/1.2.2.17811/4.SC2Replay")
168184

185+
169186
def test_observers():
170187
replay = sc2reader.load_replay("test_replays/1.2.2.17811/13.SC2Replay",debug=True)
171188

189+
172190
def test_datetimes():
173191
# Ignore seconds in comparisons, because they are off by one what is reported by Windows.
174192
# This might be a little nuance worth investigating at some point.
@@ -185,6 +203,7 @@ def test_datetimes():
185203
replay = sc2reader.load_replay("test_replays/1.2.2.17811/3.SC2Replay")
186204
assert replay.end_time == datetime.datetime(2011, 2, 25, 14, 36, 26)
187205

206+
188207
def test_hots_pids():
189208
for replayfilename in [
190209
"test_replays/2.0.3.24764/Akilon Wastes (10).SC2Replay",
@@ -195,67 +214,88 @@ def test_hots_pids():
195214
print "Processing {fname}".format(fname=replayfilename)
196215
replay = sc2reader.load_replay(replayfilename)
197216

198-
assert replay.expansion == 'HotS'
217+
assert replay.expansion == "HotS"
199218

200-
player_pids = set( [ player.pid for player in replay.players if player.is_human] )
201-
ability_pids = set( [ event.player.pid for event in replay.events if 'AbilityEvent' in event.name ] )
219+
player_pids = set([player.pid for player in replay.players if player.is_human])
220+
ability_pids = set([event.player.pid for event in replay.events if "AbilityEvent" in event.name])
202221

203222
assert ability_pids == player_pids
204223

224+
205225
def test_wol_pids():
206226
replay = sc2reader.load_replay("test_replays/1.5.4.24540/ggtracker_1471849.SC2Replay")
207227

208-
assert replay.expansion == 'WoL'
228+
assert replay.expansion == "WoL"
209229

210-
ability_pids = set( [ event.player.pid for event in replay.events if 'AbilityEvent' in event.name ] )
211-
player_pids = set( [ player.pid for player in replay.players ] )
230+
ability_pids = set([event.player.pid for event in replay.events if "AbilityEvent" in event.name])
231+
player_pids = set([player.pid for player in replay.players])
212232

213233
assert ability_pids == player_pids
214234

235+
215236
def test_hots_hatchfun():
216237
replay = sc2reader.load_replay("test_replays/2.0.0.24247/molten.SC2Replay")
217-
player_pids = set( [ player.pid for player in replay.players ] )
218-
spawner_pids = set( [ event.player.pid for event in replay.events if 'TargetAbilityEvent' in event.name and event.ability.name == 'SpawnLarva' ] )
238+
player_pids = set([ player.pid for player in replay.players])
239+
spawner_pids = set([ event.player.pid for event in replay.events if "TargetAbilityEvent" in event.name and event.ability.name == "SpawnLarva"])
219240
print "player_pids = {player_pids}, spawner_pids = {spawner_pids}".format(player_pids=player_pids, spawner_pids=spawner_pids)
220241
assert spawner_pids.issubset(player_pids)
221242

243+
222244
def test_hots_vs_ai():
223245
replay = sc2reader.load_replay("test_replays/2.0.0.24247/Cloud Kingdom LE (13).SC2Replay")
224-
assert replay.expansion == 'HotS'
246+
assert replay.expansion == "HotS"
225247
replay = sc2reader.load_replay("test_replays/2.0.0.24247/Korhal City (19).SC2Replay")
226-
assert replay.expansion == 'HotS'
248+
assert replay.expansion == "HotS"
249+
227250

228251
def test_oracle_parsing():
229252
replay = sc2reader.load_replay("test_replays/2.0.3.24764/ggtracker_1571740.SC2Replay")
230-
assert replay.expansion == 'HotS'
231-
oracles = [unit for unit in replay.objects.values() if unit.name=='Oracle']
253+
assert replay.expansion == "HotS"
254+
oracles = [unit for unit in replay.objects.values() if unit.name=="Oracle"]
232255
assert len(oracles) == 2
233256

257+
234258
def test_resume_from_replay():
235259
replay = sc2reader.load_replay("test_replays/2.0.3.24764/resume_from_replay.SC2Replay")
236260

261+
237262
def test_clan_players():
238263
replay = sc2reader.load_replay("test_replays/2.0.4.24944/Lunar Colony V.SC2Replay")
239-
assert replay.expansion == 'WoL'
264+
assert replay.expansion == "WoL"
240265
assert len(replay.people) == 4
241266

267+
242268
def test_WoL_204():
243269
replay = sc2reader.load_replay("test_replays/2.0.4.24944/ggtracker_1789768.SC2Replay")
244-
assert replay.expansion == 'WoL'
270+
assert replay.expansion == "WoL"
245271
assert len(replay.people) == 2
246272

273+
247274
def test_send_resources():
248275
replay = sc2reader.load_replay("test_replays/2.0.4.24944/Backwater Complex (15).SC2Replay")
249276

277+
250278
def test_cn_replays():
251279
replay = sc2reader.load_replay("test_replays/2.0.5.25092/cn1.SC2Replay")
252-
assert replay.gateway == 'cn'
253-
assert replay.expansion == 'WoL'
280+
assert replay.gateway == "cn"
281+
assert replay.expansion == "WoL"
282+
254283

255284
def test_plugins():
256285
factory = sc2reader.factories.SC2Factory()
257-
factory.register_plugin('Replay',APMTracker())
258-
factory.register_plugin('Replay',SelectionTracker())
259-
factory.register_plugin('Replay',toJSON())
286+
factory.register_plugin("Replay", APMTracker())
287+
factory.register_plugin("Replay", SelectionTracker())
288+
factory.register_plugin("Replay", toJSON())
260289
replay = factory.load_replay("test_replays/2.0.5.25092/cn1.SC2Replay")
261290

291+
# Load and quickly check the JSON output consistency
292+
result = json.loads(replay)
293+
assert result["map_name"] == u"生化实验区"
294+
assert result["players"][2]["name"] == "ImYoonA"
295+
assert result["players"][2]["avg_apm"] == 84.52332657200812
296+
assert result["release"] == "2.0.5.25092"
297+
assert result["game_length"] == 986
298+
assert result["real_length"] == 704
299+
assert result["gateway"] == "cn"
300+
assert result["game_fps"] == 16.0
301+
assert result["is_ladder"] is True

0 commit comments

Comments
 (0)