Skip to content

Commit

Permalink
Merge dc3d7aa into 02eea38
Browse files Browse the repository at this point in the history
  • Loading branch information
erral committed Jan 10, 2019
2 parents 02eea38 + dc3d7aa commit de2a650
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 25 deletions.
55 changes: 34 additions & 21 deletions fideparser/ratingperiod.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,22 @@ def __init__(self, country, period, arbiters_data=True, report_data=True):
self.tournaments = []
self.fieldnames = set([])

def __eq__(self, other):
fields_equal = self.fieldnames == other.fieldnames
tournaments_equal = False

for tournament in self.tournaments:
tournaments_equal = tournament in other.tournaments
if not tournaments_equal:
return False

for tournament in other.tournaments:
tournaments_equal = tournament in self.tournaments
if not tournaments_equal:
return False

return fields_equal and tournaments_equal

def save(self):
""" import the data from FIDE site """
url = BASE_URL % {"country": self.country, "period": self.period}
Expand All @@ -42,16 +58,16 @@ def save(self):
print("Tournament done")

def load_from_file(self, filepath):
fp = open(filepath, "r")
data = pickle.load(fp)
if not isinstance(data, RatingPeriod):
raise InvalideFileFormat

self.country = data.country
self.period = data.period
self.tournaments = data.tournaments
for tournament in self.tournaments:
self.fieldnames = self.fieldnames.union(tournament.data.keys())
with open(filepath, "rb") as fp:
data = pickle.load(fp)
if not isinstance(data, RatingPeriod):
raise InvalideFileFormat

self.country = data.country
self.period = data.period
self.tournaments = data.tournaments
for tournament in self.tournaments:
self.fieldnames = self.fieldnames.union(tournament.data.keys())

def export(self, filename, format="binary"):
""" return the saved data in a structured way """
Expand All @@ -63,14 +79,12 @@ def export(self, filename, format="binary"):
self.export_csv(filename)

def export_binary(self, filename):
fp = open(filename, "w")
pickle.dump(self, fp)
fp.close()
with open(filename, "wb") as fp:
pickle.dump(self, fp)

def export_json(self, filename):
fp = open(filename, "w")
json.dump(self.tournaments, fp, cls=FIDEJSONEncoder)
fp.close()
with open(filename, "w", encoding="utf-8") as fp:
json.dump(self.tournaments, fp, cls=FIDEJSONEncoder)

def export_csv(self, filename):
# If we export data to JSON and reimport without the
Expand All @@ -90,8 +104,7 @@ def export_csv(self, filename):
keys.remove("arbiter_objects")
keys = list(keys)
keys.sort()
fp = open(filename, "wb")
writer = csv.DictWriter(fp, keys, encoding="utf-8")
writer.writeheader()
writer.writerows(data)
fp.close()
with open(filename, "wb") as fp:
writer = csv.DictWriter(fp, keys, encoding="utf-8")
writer.writeheader()
writer.writerows(data)
3 changes: 3 additions & 0 deletions fideparser/tournament.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ def __init__(self, link, extract_arbiter_data=True, extract_report_data=False):
self.extract_report_data = extract_report_data
self._extract_data()

def __eq__(self, other):
return self.data == other.data

def _extract_data(self):
sock = requests.get(BASE_URL + self.link)
soup = BeautifulSoup(sock.content, "html.parser")
Expand Down
63 changes: 61 additions & 2 deletions tests/test_ratingperiod.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from .utils import get_path_to_store_export_files
from .utils import get_test_file_contents
from fideparser.ratingperiod import RatingPeriod

import os
import re
import responses
import unittest
import re


class TestArbiter(unittest.TestCase):
class TestRatingPeriod(unittest.TestCase):
def setUp(self):
ratingperiod_url = re.compile(
"https:\/\/ratings\.fide\.com\/tournament_list\.phtml\?moder=ev_code&country=[A-Z]+&rating_period=[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-01"
Expand All @@ -20,10 +22,67 @@ def setUp(self):
tournament_contents = get_test_file_contents("tournament.html")
responses.add(responses.GET, tournament_url, body=tournament_contents)

def tearDown(self):
filenames = ["myjson.csv", "myjson.json", "myjson.binary"]
for filename in filenames:
file_path = get_path_to_store_export_files(filename)
if os.path.exists(file_path):
os.remove(file_path)

@responses.activate
def test_ratingperiod_data(self):
r = RatingPeriod("ESP", "2018-07-01", arbiters_data=False, report_data=False)
r.save()

self.assertIsInstance(r.tournaments, list)
self.assertEqual(len(r.tournaments), 86)

@responses.activate
def test_ratingperiod_export_json(self):
r = RatingPeriod("ESP", "2018-07-01", arbiters_data=False, report_data=False)
r.save()
filename = "myjson.json"
export_path = get_path_to_store_export_files(filename)
r.export(export_path, "json")

dir_path = os.path.dirname(export_path)
self.assertIn(filename, os.listdir(dir_path))

@responses.activate
def test_ratingperiod_export_csv(self):
r = RatingPeriod("ESP", "2018-07-01", arbiters_data=False, report_data=False)
r.save()
filename = "myjson.csv"
export_path = get_path_to_store_export_files(filename)
r.export(export_path, "csv")

dir_path = os.path.dirname(export_path)
self.assertIn(filename, os.listdir(dir_path))

@responses.activate
def test_ratingperiod_export_binary(self):
r = RatingPeriod("ESP", "2018-07-01", arbiters_data=False, report_data=False)
r.save()
filename = "myjson.binary"
export_path = get_path_to_store_export_files(filename)
r.export(export_path, "binary")

dir_path = os.path.dirname(export_path)
self.assertIn(filename, os.listdir(dir_path))

@responses.activate
def test_ratingperiod_import_binary(self):
"""Check that exported binary can be imported """
r = RatingPeriod("ESP", "2018-07-01", arbiters_data=False, report_data=False)
r.save()
filename = "myjson.binary"
export_path = get_path_to_store_export_files(filename)
r.export_binary(export_path)

dir_path = os.path.dirname(export_path)
self.assertIn(filename, os.listdir(dir_path))

r_imported = RatingPeriod("ESP", "2018-07-01")
r_imported.load_from_file(export_path)

self.assertEqual(r, r_imported)
12 changes: 10 additions & 2 deletions tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,13 @@

def get_test_file_contents(filename):
dir_path = os.path.dirname(os.path.realpath(__file__))
arbiter_url_file = open(os.path.join(dir_path, "fide_responses", filename))
return arbiter_url_file.read()
fp = open(os.path.join(dir_path, "fide_responses", filename))
data = fp.read()
fp.close()
return data


def get_path_to_store_export_files(filename):
dir_path = os.path.dirname(os.path.realpath(__file__))
file_path = os.path.join(dir_path, "fide_responses", filename)
return file_path

0 comments on commit de2a650

Please sign in to comment.