Skip to content

Commit d86e614

Browse files
committed
Integrates new PlayerDict utility class that keeps a double index and updated tests.
The Replay.player dict is now a PlayerDict (subclassed) which retains all the dict functionality and compatibility while making its values accessible by both pid and player name. For example: test = Player { pid = 1, name = "Tester" } d = PlayerDict(Tester=test) or d = PlayerDict(); d[1] = test or d = PlayerDict(); d["Tester"] = test d[1] and d["Tester"] will retrieve the same player. It should be noted that deletion can only be done by the players pid at this time. See the tests for example usage information.
1 parent 842da88 commit d86e614

File tree

3 files changed

+43
-12
lines changed

3 files changed

+43
-12
lines changed

sc2reader/replay.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
from mpyq import MPQArchive
55

66
import parsers
7-
from utils import ByteStream
8-
9-
7+
from utils import ByteStream,PlayerDict
8+
109
class Replay(object):
1110

1211
def __init__(self, replay, partial_parse=True, full_parse=True):
@@ -22,7 +21,7 @@ def __init__(self, replay, partial_parse=True, full_parse=True):
2221
self.results = dict()
2322
self.teams = defaultdict(list)
2423
self.players = list() #Unordered list of Player
25-
self.player = dict() #Maps pid to Player
24+
self.player = PlayerDict() #Maps pid to Player
2625
self.events_by_type = dict()
2726
self.attributes = list()
2827
self.length = None # (minutes, seconds) tuple

sc2reader/utils.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,37 @@
1+
class PlayerDict(dict):
2+
def __init__(self,*args,**kwargs):
3+
self._key_map = dict()
4+
5+
if args:
6+
print args
7+
for arg in args[0]:
8+
self[arg[0]] = arg[1]
9+
10+
if kwargs:
11+
print kwargs
12+
for key,value in kwargs.iteritems():
13+
self[key] = value
14+
15+
def __getitem__(self,key):
16+
if isinstance(key,str):
17+
key = self._key_map[key]
18+
19+
return super(PlayerDict,self).__getitem__(key)
20+
21+
def __setitem__(self,key,value):
22+
#if not isinstance(value,Player):
23+
# raise TypeError("Values must be of the Player class")
24+
25+
if isinstance(key,str):
26+
self._key_map[key] = value.pid
27+
key = value.pid
28+
elif isinstance(key,int):
29+
self._key_map[value.name] = key
30+
31+
super(PlayerDict,self).__setitem__(value.pid,value)
32+
33+
34+
135
class ByteStream(object):
236
"""Track and return the bytes for investigative and debugging purposes"""
337
"""Most functions will return the byte_code as well when requested"""

test_replays/test_all.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ def test_1():
4646
assert len(replay.players) == 2
4747
assert replay.player[1].name == "Emperor"
4848
assert replay.player[2].name == "Boom"
49-
emperor = find(lambda player: player.name == "Emperor", replay.players)
49+
emperor = replay.player['Emperor']
5050
assert emperor.team == 1
5151
assert emperor.choosen_race == "Protoss"
5252
assert emperor.actual_race == "Protoss"
5353
assert emperor.recorder == False
5454

55-
boom = find(lambda player: player.name == "Boom", replay.players)
55+
boom = replay.player['Boom']
5656
assert boom.team == 2
5757
assert boom.choosen_race == "Terran"
5858
assert boom.actual_race == "Terran"
@@ -116,17 +116,15 @@ def test_3v3():
116116
def test_random_player():
117117
replay = Replay("test_replays/build17811/3.sc2replay")
118118

119-
gogeta = find(lambda player: player.name == "Gogeta", replay.players)
119+
gogeta = replay.player['Gogeta']
120120
assert gogeta.choosen_race == "Random"
121121
assert gogeta.actual_race == "Terran"
122122

123123
def test_us_realm():
124124
replay = Replay("test_replays/build17811/5.sc2replay")
125-
shades = find(lambda player: player.name == "ShadesofGray", replay.players)
126-
dawn = find(lambda player: player.name == "reddawn", replay.players)
127-
128-
assert shades.url == "http://us.battle.net/sc2/en/profile/2358439/1/ShadesofGray/"
129-
assert dawn.url == "http://us.battle.net/sc2/en/profile/2198663/1/reddawn/"
125+
126+
assert replay.player['ShadesofGray'].url == "http://us.battle.net/sc2/en/profile/2358439/1/ShadesofGray/"
127+
assert replay.player['reddawn'].url == "http://us.battle.net/sc2/en/profile/2198663/1/reddawn/"
130128

131129

132130
def test_encrypted():

0 commit comments

Comments
 (0)