def test_create_and_retrieve_anime_by_name_and_alias(session):
    season = Season.get_or_create(SeasonOfYear.SPRING, 2006, session)
    anime = Anime.create(1234, "The Melancholy of Haruhi Suzumiya", season,
                         session)

    assert anime == Anime.get_by_name("The Melancholy of Haruhi Suzumiya",
                                      session)

    anime.add_alias("Suzumiya Haruhi no Yuutsu")

    assert anime == Anime.get_by_name("Suzumiya Haruhi no Yuutsu", session)
def test_bench_swap(
    # patches
    season_config_mock,
    # fixtures
    session,
    config_functor,
):
    config_function = config_functor(
        sections=["weekly info", "season info"],
        kv={"current-week": 0, "min-weeks-between-bench-swaps": 3},
    )
    season_config_mock.getint.side_effect = config_function

    season = Season.get_or_create(SeasonOfYear.SPRING, 2006, session)
    haruhi = Anime.create(1234, "The Melancholy of Haruhi Suzumiya", season, session)
    bebop = Anime.create(4321, "Cowboy Bebop", season, session)
    team = Team.create(name=fake.user_name(), season=season, session=session)
    team.add_anime_to_team(haruhi)
    team.add_anime_to_team(bebop, True)

    with pytest.raises(AssertionError):
        # this should fail since bench and active are swapped
        team.bench_swap(active_anime=bebop, bench_anime=haruhi, week=0)

    team.bench_swap(active_anime=haruhi, bench_anime=bebop, week=0)

    week_snapshot = team.get_anime(week=0)
    assert week_snapshot == WeekSnapshotOfTeamAnime(
        week=0, active=[bebop], bench=[haruhi]
    )

    with pytest.raises(AssertionError):
        # this should fail since we just swapped this week
        team.bench_swap(active_anime=bebop, bench_anime=haruhi, week=0)

    for week in range(1, 5):
        season.init_new_week(week)

    config_function = config_functor(
        sections=["weekly info", "season info"],
        kv={"current-week": 4, "min-weeks-between-bench-swaps": 3},
    )
    season_config_mock.getint.side_effect = config_function

    team.bench_swap(active_anime=bebop, bench_anime=haruhi, week=4)
    week_snapshot = team.get_anime(week=4)
    assert week_snapshot == WeekSnapshotOfTeamAnime(
        week=4, active=[haruhi], bench=[bebop]
    )
Esempio n. 3
0
    def calculate_anime_weekly_points(
        self,
        anime: Anime,
        stat_data: JikanResults,
        num_teams_owned_active: int,
        double_score_max_num_teams: int,
        num_regions: int,
        is_licensed: bool,
    ) -> int:
        """
        Calculate the points for the week for the anime based on the stats
        """
        lower_ownership_multiplier = (
            2 if num_teams_owned_active <= double_score_max_num_teams else 1)

        # fmt: off
        points = (lower_ownership_multiplier *
                  (stat_data.watching + stat_data.completed) +
                  self.dropped_multiplier * stat_data.dropped +
                  self.favorite_multiplier * stat_data.favorites +
                  self.simulcast_multiplier * num_regions +
                  self.license_score * int(is_licensed))

        if self.current_week % self.forum_post_week_interval == 0:
            previous_forum_posts = anime.get_forum_posts_for_week(
                self.current_week - self.forum_post_week_interval)
            points += self.forum_post_multipler * (
                stat_data.total_forum_posts - previous_forum_posts)

        # multiplying by None type produces weird results
        # so we do these calculations only if stat_data.score exists
        if stat_data.score:
            points += int(self.anime_score_multipler * stat_data.score)
        return points
 def _execute(self, session: Session, season: Season) -> None:
     post_content_regex = re.compile(r"(.+)\<br /\>.*\\n(.+)")
     for username, post_content in self.get_swaps(session):
         match = post_content_regex.fullmatch(post_content)
         try:
             assert match
         except AssertionError:
             print(f"Unexpected post contents: {post_content}")
             raise
         active, bench = match.group(1, 2)
         team = Team.get_by_name(name=username,
                                 season=season,
                                 session=session)
         team.bench_swap(
             active_anime=Anime.get_by_name(active, session),
             bench_anime=Anime.get_by_name(bench, session),
             week=self.current_week,
         )
Esempio n. 5
0
    def get_licensed_anime(self, session: Session) -> Set[int]:
        print("Getting licensed anime from licenses file")
        licensed_anime = set()
        if self.licenses_lines is not None:
            for title in self.licenses_lines:
                title = title.strip()
                try:
                    anime = Anime.get_by_name(title, session)
                except sqlalchemy.orm.exc.NoResultFound:
                    print(f"{title} is not found in database")
                    continue

                licensed_anime.add(anime.mal_id)
        return licensed_anime
Esempio n. 6
0
    def get_anime_simulcast_region_counts(self,
                                          session: Session) -> Dict[int, int]:
        print("Getting region counts of each anime in simulcast file")
        anime_simulcast_region_counts = {}
        if self.simulcast_lines is not None:
            for line in self.simulcast_lines:
                title, subs = line.split("=")
                title = title.strip()
                try:
                    anime = Anime.get_by_name(title, session)
                except sqlalchemy.orm.exc.NoResultFound:
                    print(f"{title} is not found in database")
                    continue

                num_regions = len(
                    [entry for entry in subs.split() if entry == "simul"])
                anime_simulcast_region_counts[anime.mal_id] = num_regions
        return anime_simulcast_region_counts
def test_add_same_anime_to_team_raises_exception(
    # patches
    config_mock,
    # factories
    season_factory,
    # fixtures
    session,
    config_functor,
):
    config_function = config_functor(sections=["weekly info"], kv={"current-week": 0})
    config_mock.getint.side_effect = config_function

    season = season_factory()
    anime = Anime.create(1234, "The Melancholy of Haruhi Suzumiya", season, session)
    team = Team.create(name=fake.user_name(), season=season, session=session)
    team.add_anime_to_team(anime)
    with pytest.raises(IntegrityError):
        team.add_anime_to_team(anime, True)
Esempio n. 8
0
    def get_anime(self, week: int) -> WeekSnapshotOfTeamAnime:
        """
        Returns all anime on team during week specified
        """
        this_week_anime = (self._session.query(orm.TeamWeeklyAnime).filter(
            orm.TeamWeeklyAnime.team_id == self._entity.id,
            orm.TeamWeeklyAnime.week == week,
        ).all())

        snapshot = WeekSnapshotOfTeamAnime(week=week)
        for team_weekly_anime in this_week_anime:
            anime = Anime.from_orm_anime(team_weekly_anime.anime,
                                         self._session)
            if team_weekly_anime.bench:
                snapshot.bench.append(anime)
            else:
                snapshot.active.append(anime)

        return snapshot
def test_create_anime_twice_throws_exception(session):
    season = Season.get_or_create(SeasonOfYear.SPRING, 2006, session)
    Anime.create(1234, "The Melancholy of Haruhi Suzumiya", season, session)
    with pytest.raises(IntegrityError):
        Anime.create(1234, "Suzumiya Haruhi no Yuutsu", season, session)
def test_retrieve_anime_does_not_exist(session):
    season = Season.get_or_create(SeasonOfYear.SPRING, 2006, session)
    Anime.create(1234, "The Melancholy of Haruhi Suzumiya", season, session)

    with pytest.raises(NoResultFound):
        Anime.get_by_name("Suzumiya Haruhi no Yuutsu", session)