Skip to content

Commit 12a27f9

Browse files
committed
Cleaned up method names and comments
- Trying to stick to convention of "players" for game parameters - add Parameters section in docstrings for method parameters
1 parent d975b32 commit 12a27f9

File tree

3 files changed

+45
-44
lines changed

3 files changed

+45
-44
lines changed

api/core/models.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
from rest_framework import serializers
21
from django.contrib.postgres.fields import JSONField
3-
import axelrod as axl
4-
5-
from .utils import strategy_id
6-
72
from django.db.models import (
83
BooleanField,
94
DateTimeField,
@@ -15,9 +10,7 @@
1510
ManyToManyField,
1611
TextField,
1712
)
18-
19-
strategies_index = {strategy_id(s): s for s in axl.strategies}
20-
CHEATING_NAMES = [strategy.__name__ for strategy in axl.cheating_strategies]
13+
import axelrod as axl
2114

2215

2316
class Game(Model):

api/core/serializers.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,10 @@ def get_params(self, strategy):
4747
return params
4848

4949

50-
class StringListField(serializers.ListField):
51-
child = serializers.CharField()
52-
53-
5450
class TournamentDefinitionSerializer(serializers.ModelSerializer):
5551

56-
def validate_player_list(self, player_list):
52+
@staticmethod
53+
def validate_player_list(player_list):
5754
if len(player_list) < 2:
5855
raise serializers.ValidationError('Ensure this field has at least 2 elements.')
5956
return player_list
@@ -74,7 +71,8 @@ class Meta:
7471

7572
class MatchDefinitionSerializer(serializers.ModelSerializer):
7673

77-
def validate_player_list(self, player_list):
74+
@staticmethod
75+
def validate_player_list(player_list):
7876
if len(player_list) != 2:
7977
raise serializers.ValidationError('Ensure this field has exactly 2 elements.')
8078
return player_list
@@ -95,7 +93,8 @@ class Meta:
9593
class MoranDefinitionSerializer(serializers.ModelSerializer):
9694
mode = serializers.CharField(min_length=2, max_length=2)
9795

98-
def validate_player_list(self, player_list):
96+
@staticmethod
97+
def validate_player_list(player_list):
9998
if len(player_list) < 2:
10099
raise serializers.ValidationError('Ensure this field has at least 2 elements.')
101100
return player_list
@@ -115,6 +114,10 @@ class Meta:
115114

116115

117116
class GameResultSerializer:
117+
"""
118+
Serialize the result of an axelrod game into a dictionary by
119+
iterating over its __dict__ method.
120+
"""
118121

119122
def __init__(self, result):
120123
response_object = {}
@@ -175,16 +178,7 @@ def __init__(self, result):
175178

176179

177180
class TournamentResultsSerializer(GameResultSerializer):
178-
"""
179-
Serialize an axelrod ResultSet class into a dictionary by
180-
iterating over its __dict__ method.
181-
182-
For complex objects (Game, State objects) more in depth serialization
183-
is required - these are handled in separate methods. For example the
184-
state_distribution_keys are
185-
"""
186181

187-
# TODO implement state_distribution serializations
188182
state_distribution_keys = [
189183
]
190184

api/core/views.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,18 @@ class GameViewSet(viewsets.ViewSet):
8686
strategies_index = {strategy_id(s): s for s in axl.strategies}
8787
_not_found_error = 'Strategy not found: {}'
8888

89-
def _parse_players(self, player_list):
89+
def get_strategy_from_id(self, player_list):
9090
"""
91-
generate the axelrod Strategy from each player
92-
in the player list.
91+
retrieve the axelrod Strategy or each player
92+
in the player list and instantiate them.
9393
9494
Parameters
9595
----------
9696
player_list: list of strings
97-
a list of player ids
97+
a list of strategy ids
9898
"""
99+
# note that the strategy is being instantiated - bugs with
100+
# misleading error messages will be generated if they are not
99101
return [self.strategies_index[s]() for s in player_list]
100102

101103
@staticmethod
@@ -114,23 +116,35 @@ def create_players(strategy):
114116
except ObjectDoesNotExist:
115117
return InternalStrategy.objects.create(id=strategy)
116118

117-
def start(self, definition, strategies):
118-
"""start a game based on definition and list of strategies"""
119+
def start_game(self, definition, players):
120+
"""
121+
start a game based on definition and list of strategies
122+
123+
Parameters
124+
----------
125+
definition: GameDefinition
126+
definition class that contains all game parameters
127+
players: list of axelrod.Strategy
128+
**instantiated** axelrod Strategy classes that are
129+
playing the game
130+
"""
119131
game = self.model.objects.create(definition=definition, status=0)
120-
result = game.run(strategies)
132+
result = game.run(players)
121133
game.results = self.results_serializer(result).data
122134
game.save()
123135
return game
124136

125137
def create(self, request):
126138
"""
127-
Take in a game_definition which expects all of the
128-
required parameters of the type of game, a list of
129-
player strings, and starts the game.
139+
Take in a game definition from JSON post data which
140+
expects all of the required parameters of the game,
141+
a list of and a list of player strings. Once all of
142+
these are validated, start the game.
130143
"""
131144
try:
132-
strategies = self._parse_players(request.data['player_list'])
145+
players = self.get_strategy_from_id(request.data['player_list'])
133146
except KeyError as e:
147+
# handle case where strategy id is not found in list of strategies
134148
return Response({
135149
'player_list': [self._not_found_error.format(e.args[0])]
136150
}, 400)
@@ -141,15 +155,14 @@ def create(self, request):
141155
definition_serializer = self.definition_serializer(data=request.data)
142156
if definition_serializer.is_valid():
143157
definition = definition_serializer.save()
144-
game = self.start(definition, strategies)
145-
response = self.response_serializer(game)
146-
return Response(response.data, 201)
158+
game = self.start_game(definition, players)
159+
return Response(self.game_serializer(game).data, 201)
147160
return Response(definition_serializer.errors, 400)
148161

149162
def list(self, request):
150163
"""retrieve a list of all games of this type"""
151164
games = self.model.objects.all()
152-
serializer = self.response_serializer(games, many=True)
165+
serializer = self.game_serializer(games, many=True)
153166
return Response(serializer.data, 200)
154167

155168
def retrieve(self, request, pk=None):
@@ -158,10 +171,11 @@ def retrieve(self, request, pk=None):
158171
game = self.model.objects.get(id=pk)
159172
except ObjectDoesNotExist:
160173
raise Http404
161-
serializer = self.response_serializer(game)
174+
serializer = self.game_serializer(game)
162175
return Response(serializer.data, 200)
163176

164177
def destroy(self, request, pk=None):
178+
"""delete a specific game"""
165179
try:
166180
self.model.objects.get(id=pk).delete()
167181
except ObjectDoesNotExist:
@@ -179,7 +193,7 @@ class TournamentViewSet(GameViewSet):
179193
definition_serializer = TournamentDefinitionSerializer
180194
definition_model = models.TournamentDefinition
181195
results_serializer = TournamentResultsSerializer
182-
response_serializer = TournamentSerializer
196+
game_serializer = TournamentSerializer
183197
model = models.Tournament
184198

185199

@@ -192,20 +206,20 @@ class MatchViewSet(GameViewSet):
192206
definition_serializer = MatchDefinitionSerializer
193207
definition_model = models.MatchDefinition
194208
results_serializer = MatchResultsSerializer
195-
response_serializer = MatchSerializer
209+
game_serializer = MatchSerializer
196210
model = models.Match
197211

198212

199213
class MoranViewSet(GameViewSet):
200214
"""
201215
View that handles the creation and retrieval of Moran
202-
Processes. This is a
216+
Processes.
203217
"""
204218

205219
definition_serializer = MoranDefinitionSerializer
206220
definition_model = models.MoranDefinition
207221
results_serializer = MoranResultsSerializer
208-
response_serializer = MoranSerializer
222+
game_serializer = MoranSerializer
209223
model = models.MoranProcess
210224

211225

0 commit comments

Comments
 (0)