Ejemplo n.º 1
0
    def test_insert(self):
        # Disable Foreign Keys checks for this test
        TestTeam.db.disableForeignKeys()

        with TestTeam.db.transaction() as t:
            TestTeam.db.upsert(
                Team('team name TD INS', 'league mnemonic TD UPD',
                     'team season TD UPD'))
            objs = TestTeam.db.select(Team())

            self.assertEqual(len(objs), 3)

            d = eval("{'name': 'team name TD INS'}")
            for k, v in d.items():
                self.assertEqual(objs[2].__getattribute__('get' + k.title())(),
                                 v)

            d = eval(
                "{'league': 'league mnemonic TD UPD', 'season': 'team season TD UPD'}"
            )
            for k, v in d.items():
                self.assertEqual(objs[2].__getattribute__('get' + k.title())(),
                                 v)

            # force a rollback
            t.fail()
Ejemplo n.º 2
0
    def test_select(self):
        objs = TestTeam.db.select(Team())
        self.assertEqual(len(objs), 2)
        self.assertEqual(objs[0].getName(), 'team name TD')

        self.assertEqual(objs[0].getLeague(), 'league mnemonic TD')
        self.assertEqual(objs[0].getSeason(), 'team season TD')

        self.assertEqual(objs[1].getName(), 'team name TD2')

        self.assertEqual(objs[1].getLeague(), 'league mnemonic TD2')
        self.assertEqual(objs[1].getSeason(), 'team season TD2')

        objs = TestTeam.db.select(Team('team name TD'))
        self.assertEqual(len(objs), 1)
        self.assertEqual(objs[0].getName(), 'team name TD')

        self.assertEqual(objs[0].getLeague(), 'league mnemonic TD')
        self.assertEqual(objs[0].getSeason(), 'team season TD')

        objs = TestTeam.db.select(
            Team.createAdhoc({
                'league': 'league mnemonic TD',
                'season': 'team season TD'
            }))
        self.assertEqual(len(objs), 1)
        self.assertEqual(objs[0].getName(), 'team name TD')

        self.assertEqual(objs[0].getLeague(), 'league mnemonic TD')
        self.assertEqual(objs[0].getSeason(), 'team season TD')
Ejemplo n.º 3
0
    def test_sourceData_CurrentSeason(self):
        with Database(self.dbName, SQLite3Impl()) as db, \
                db.transaction() as t:
            seasonMap = db.select(Source_Season_Map(98))[0]
            seasonMap.setActive(1)
            db.upsert(seasonMap)
            seasonMap = Source_Season_Map(98, 'season name TD2', \
                    'source_season_map moniker TD2', \
                    'source_season_map data_url TD2', 1)
            db.upsert(seasonMap)

        sourceData(self.mock_Logger, 'source name TD', True)

        self.mock_readCSVFileAsDict.assert_any_call( \
                'source_season_map data_url TD2')

        calls = (
                    call.info(
                        'Downloading data from source: source name TD'),
                    call.debug('Opening database: ./db/test.db'),
                    call.debug(
                        "source : Keys {'id': 98} : Values {'name': " \
                        "'source name TD', 'fixtures_url': 'source " \
                        "fixtures_url TD', 'url': 'source url TD'}"),
                    call.debug(
                        "[source_season_map : Keys {'source_id': 98, "\
                        "'season': 'season name TD2'} : Values {'moniker'" \
                        ": 'source_season_map moniker TD2', 'data_url': " \
                        "'source_season_map data_url TD2', 'active': 1}]"),
                    call.debug(
                        "[source_league_map : Keys {'source_id': 98, " \
                        "'league': 'league mnemonic TD'} : Values " \
                        "{'moniker': 'source_league_map moniker TD'}]"),
                    call.debug(
                        "[team : Keys {'name': 'team name TD'} : Values " \
                        "{'league': 'league mnemonic TD'}, " \
                        "team : Keys {'name': 'team name TD2'} : Values " \
                        "{'league': 'league mnemonic TD2'}]"),
                    call.info('Downloading...source_season_map data_url TD2'),
                )
        self.mock_Logger.assert_has_calls(calls)

        with Database(self.dbName, SQLite3Impl()) as db:
            ht = db.select(Team('Coventry', 'league mnemonic TD'))[0]
            at = db.select(Team('Cardiff', 'league mnemonic TD'))[0]
            match = db.select(Match(201010191))[0]

            self.assertTrue(ht and at and match)
            self.assertEquals(match.getDate(), '2010-10-19')
            self.assertEquals(match.getLeague(), 'league mnemonic TD')
            self.assertEquals(match.getHome_Team(), 'Coventry')
            self.assertEquals(match.getAway_Team(), 'Cardiff')
            self.assertEquals(match.getResult(), 'A')
            self.assertEquals(match.getBest_Odds_H(), 3.12)
            self.assertEquals(match.getBest_Odds_D(), 3.4)
            self.assertEquals(match.getBest_Odds_A(), 2.4)
            self.assertEquals(match.getHome_Goals(), 1)
            self.assertEquals(match.getAway_Goals(), 2)
            self.assertEquals(match.getHome_Lp(), None)
            self.assertEquals(match.getAway_Lp(), None)
Ejemplo n.º 4
0
    def test_delete(self):
        # Disable Foreign Keys checks for this test
        TestTeam.db.disableForeignKeys()

        with TestTeam.db.transaction() as t:
            TestTeam.db.delete(Team('team name TD'))

            objs = TestTeam.db.select(Team())
            self.assertEqual(len(objs), 1)

            # force a rollback
            t.fail()
Ejemplo n.º 5
0
    def test_create(self):
        obj = Team.create(
            ('team name TD', 'league mnemonic TD', 'team season TD'))

        self.assertEqual(obj.getName(), 'team name TD')

        self.assertEqual(obj.getLeague(), 'league mnemonic TD')
        self.assertEqual(obj.getSeason(), 'team season TD')
Ejemplo n.º 6
0
def sourceData(log: Logger, target: str, currentSeason: bool):
    '''
    Obtain historical match data

    :param log: a logging object
    :param target: the name of match data source
    :param currentSeason: True if only interested in the current season's data
    '''
    log.info('Downloading data from source: {}'.format(target))

    config = getSweeperConfig()
    dbName = config['dbName']
    log.debug('Opening database: {}'.format(dbName))

    with Database(dbName, SQLite3Impl()) as db, db.transaction() as t:
        keys = {'name': target}
        source = db.select(Source.createAdhoc(keys))
        if source:
            source = source[0]
        else:
            sys.exit('{} source not in database'.format(target))
        log.debug('{}'.format(source))

        sourceId = source.getId()
        keys = {'source_id': sourceId, 'active': 1}
        if currentSeason:
            seasonMap = db.select(
                Source_Season_Map.createAdhoc(keys, ('>season', )))[0:1]
        else:
            seasonMap = db.select(
                Source_Season_Map.createAdhoc(keys, ('>season', )))
        log.debug('{}'.format(seasonMap))

        keys = {'source_id': sourceId}
        leagueMap = db.select(Source_League_Map.createAdhoc(keys))
        log.debug('{}'.format(leagueMap))

        teams = db.select(Team())
        log.debug('{}'.format(teams))

        # Process the historical data...
        for l in leagueMap:
            for s in seasonMap:
                url = s.getData_Url().format(l.getLeague())
                try:
                    processMatchData(log, db, url, sourceId, s.getSeason())
                except Exception as e:
                    log.info('Cannot process %s' % url)

        # Get the upcoming fixtures too...
        processMatchData(log, db, source.getUrl(), sourceId,
                         seasonMap[0].getSeason(), leagueMap)
Ejemplo n.º 7
0
def processMatchData(log, db, url, sourceId, season, leagueMap=None):
    log.info('Downloading...' + url)

    with readCSVFileAsDict(url) as resultsReader:
        for row in resultsReader:
            try:
                dt = datetime.strptime(row['Date'], '%d/%m/%y')
            except Exception as e:
                try:
                    dt = datetime.strptime(row['Date'], '%d/%m/%Y')
                except:
                    log.debug('Date conversion failed: {}'.format(e))
                    continue
            try:
                lge = row["b'Div"]
            except:
                lge = row['b"Div']

            if leagueMap and lge not in [l.getLeague() for l in leagueMap]:
                continue

            ht = row['HomeTeam']
            keys = {'source_id': sourceId, 'moniker': ht}
            teamMap = db.select(Source_Team_Map.createAdhoc(keys))
            if teamMap: ht = teamMap[0].getTeam()
            db.upsert(Team(ht, lge, season))

            at = row['AwayTeam']
            keys = {'source_id': sourceId, 'moniker': at}
            teamMap = db.select(Source_Team_Map.createAdhoc(keys))
            if teamMap: at = teamMap[0].getTeam()
            db.upsert(Team(at, lge, season))

            bestH, bestD, bestA = getBestOdds(log, row)
            match = Match(str(dt.date()), lge, ht, at, \
                    row['FTR'], bestH, bestD, bestA, \
                    row['FTHG'], row['FTAG'])
            log.debug(match)
            db.upsert(match)
Ejemplo n.º 8
0
 def test_repr(self):
     obj = Team('team name TD', 'league mnemonic TD', 'team season TD')
     self.assertEqual(
         str(obj),
         "team : Keys {'name': 'team name TD'} : Values {'league': 'league mnemonic TD', 'season': 'team season TD'}"
     )
Ejemplo n.º 9
0
 def test_keys_adhoc(self):
     l = Team.createAdhoc(None)
     self.assertEqual(l.getTable(), 'team')
     self.assertTrue(l._keys.getFields() is None)
Ejemplo n.º 10
0
 def test_isNullable(self):
     obj = Team()
     self.assertTrue(True)
Ejemplo n.º 11
0
def genLeagueTable(log:Logger, league:str, season:str, date:str=None, \
        show:bool=False):
    '''
    Generate a league table for the subject league and season

    :param log: a logging object
    :param league: the subject league
    :param season: the subject season
    :param date: the date string up to which to generate the league YYYY-MM-DD
    :param show: displays any tables as HTML when True
    '''
    log.info('Generating league table for ' \
            'league <{}> and season <{}>'.format(league, season))

    config = getSweeperConfig()
    dbName = config['dbName']
    log.debug('Opening database: {}'.format(dbName))

    with Database(dbName, SQLite3Impl()) as db, db.transaction() as t:     
        try:
            league = db.select(League(league))[0]
        except:
            log.critical('No league matching the provided mnemonic exists')
            sys.exit(3)
        try:
            season = db.select(Season(season))[0]
        except:
            log.critical('No season matching the provided string exists')
            sys.exit(4)

        ubnd =  date if date is not None else season.getU_Bnd_Date()
        keys = {'league' : league.getMnemonic(), '!result' : '', '>date' : \
                season.getL_Bnd_Date(), '<date' : ubnd} 
        matches = [m for m in db.select(Match.createAdhoc(keys))]
        log.info('{} {} matches found'.format(len(matches), \
                league.getMnemonic()))

        keys = {'league' : league.getMnemonic(), 'season' : season.getName()}
        teams = db.select(Team.createAdhoc(keys)) 

        table = dict([(t.getName(), Form()) for t in teams])
        for m in matches:
            table[m.getHome_Team()] = h = table.get(m.getHome_Team(), Form())
            table[m.getAway_Team()] = a = table.get(m.getAway_Team(), Form())
            h.played += 1
            a.played += 1
            h.glfor += m.getHome_Goals()
            h.glagn += m.getAway_Goals()
            h.gldif = h.glfor - h.glagn
            a.glfor += m.getAway_Goals()
            a.glagn += m.getHome_Goals()
            a.gldif = a.glfor - a.glagn
            if m.getResult() == 'H':
                h.won += 1
                h.points += 3
                a.lost += 1
            elif m.getResult() == 'D':
                h.drawn += 1
                h.points += 1
                a.drawn += 1
                a.points += 1
            elif m.getResult() == 'A':
                a.won += 1
                a.points += 3
                h.lost += 1
            else:
                raise Exception("Empty result, wasn't expecting that")

        headers = ['Team', 'P', 'W', 'D', 'L', 'F', 'A', 'GD', 'PTS']
        schema = ['{:<20}', '{:>3}', '{:>3}', '{:>3}', '{:>3}', '{:>3}', \
                '{:>3}', '{:>4}', '{:>4}']
        t = Table(headers=headers, schema=schema, title='{} Table'.format(\
                league.getDesc()))
        t.append([[row[0], *row[1].asList()] for row in  \
                sorted(sorted(table.items(), key=itemgetter(0)), \
                key=lambda x : (x[1].points, x[1].gldif, x[1].glfor), \
                reverse=True)])
        log.info(t)

        if show: t.asHTML(show)

        return t