def test_invalid_color() -> None: d = Container({'original_name': 'PD', 'archetype_name': 'Control', 'colors': ['U', 'X']}) try: deck_name.normalize(d) assert False except InvalidDataException: assert True
def __init__(self, d): self._deck = d self.prepare_deck(self._deck) self.cards = d.all_cards() # This is called 'decks' and not something more sane because of limitations of Mustache and our desire to use a partial for decktable. self.decks = deck.get_similar_decks(d) self.has_similar = len(self.decks) > 0 self.matches = deck.get_matches(d, True) for m in self.matches: m.display_date = dtutil.display_date(m.date) if m.opponent: m.opponent_url = url_for('person', person_id=m.opponent) else: m.opponent = 'BYE' m.opponent_url = False if m.opponent_deck_id: m.opponent_deck_url = url_for('decks', deck_id=m.opponent_deck_id) else: m.opponent_deck_url = False if m.opponent_deck: m.opponent_deck_name = deck_name.normalize(m.opponent_deck) else: m.opponent_deck_name = '-' if self.has_rounds(): m.display_round = display_round(m) self._deck['maindeck'].sort(key=lambda x: oracle.deck_sort(x['card'])) self._deck['sideboard'].sort(key=lambda x: oracle.deck_sort(x['card'])) self.admin = session.get('admin', False) if self.admin: self.archetypes = archetype.load_archetypes_deckless( order_by='a.name') self.edit_archetype_url = url_for('edit_archetypes') self.cardhoarder_url = fetcher.cardhoarder_url(d)
def test_normalize(original_name: str, expected: str, colors: List[str], archetype_name: str) -> None: d = Container({ 'original_name': original_name, 'archetype_name': archetype_name, 'colors': colors or [] }) assert deck_name.normalize(d) == expected
def prime_cache(d) -> None: set_colors(d) colors_s = json.dumps(d.colors) colored_symbols_s = json.dumps(d.colored_symbols) set_legality(d) legal_formats_s = json.dumps(list(d.legal_formats)) normalized_name = deck_name.normalize(d) db().begin() db().execute('DELETE FROM deck_cache WHERE deck_id = %s', [d.id]) db().execute('INSERT INTO deck_cache (deck_id, normalized_name, colors, colored_symbols, legal_formats) VALUES (%s, %s, %s, %s, %s)', [d.id, normalized_name, colors_s, colored_symbols_s, legal_formats_s]) db().commit()
def prepare_deck(self, d): set_stars_and_top8(d) if d.get('colors') is not None: d.colors_safe = colors_html(d.colors, d.colored_symbols) d.name = deck_name.normalize(d) d.person_url = url_for('person', person_id=d.person_id) d.date_sort = dtutil.dt2ts(d.date) d.display_date = dtutil.display_date(d.date) d.show_record = d.wins or d.losses or d.draws if d.competition_id: d.competition_url = url_for('competition', competition_id=d.competition_id) d.url = url_for('decks', deck_id=d.id) d.export_url = url_for('export', deck_id=d.id) d.cmc_chart_url = url_for('cmc_chart', deck_id=d.id) if d.source_name == 'League' and d.wins + d.losses < 5 and d.competition_end_date > dtutil.now( ) and not d.get('retired', False): d.stars_safe = '<span title="Active in the current league">⊕</span> {stars}'.format( stars=d.stars_safe).strip() d.source_sort = '1' d.comp_row_len = len("{comp_name} (Piloted by {person}".format( comp_name=d.competition_name, person=d.person)) if d.get('archetype_id', None): d.archetype_url = url_for('archetype', archetype_id=d.archetype_id) if d.omw is not None: d.omw = str(int(d.omw)) + '%' else: d.omw = '' d.has_legal_format = len(d.legal_formats) > 0 d.pd_legal = 'Penny Dreadful' in d.legal_formats d.legal_icons = '' sets = legality.SEASONS if 'Penny Dreadful' in d.legal_formats: icon = rotation.last_rotation_ex()['code'].lower() n = sets.index(icon.upper()) + 1 d.legal_icons += '<a href="{url}"><i class="ss ss-{code} ss-rare ss-grad">S{n}</i></a>'.format( url=url_for('season', season_id=n), code=icon, n=n) past_pd_formats = [ fmt.replace('Penny Dreadful ', '') for fmt in d.legal_formats if 'Penny Dreadful ' in fmt ] past_pd_formats.sort(key=lambda code: -sets.index(code)) for code in past_pd_formats: n = sets.index(code.upper()) + 1 d.legal_icons += '<a href="{url}"><i class="ss ss-{set} ss-common ss-grad">S{n}</i></a>'.format( url=url_for('season', season_id=n), set=code.lower(), n=n) if 'Commander' in d.legal_formats: # I think C16 looks the nicest. d.legal_icons += '<i class="ss ss-c16 ss-uncommon ss-grad">CMDR</i>' d.decklist = str(d).replace('\n', '<br>')
def prime_cache(d: Deck) -> None: set_colors(d) colors_s = json.dumps(d.colors) colored_symbols_s = json.dumps(d.colored_symbols) set_legality(d) legal_formats_s = json.dumps(list(d.legal_formats)) normalized_name = deck_name.normalize(d) # If this is a new deck we're going to make a new record. If it's an existing deck we might as well update a few things that might have changed implementation but should otherwise be static. But leave wins/draws/losses/active date alone. sql = """ INSERT INTO deck_cache (deck_id, normalized_name, colors, colored_symbols, legal_formats, wins, draws, losses, active_date) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE normalized_name = %s, colors = %s, colored_symbols = %s, legal_formats = %s """ db().execute(sql, [d.id, normalized_name, colors_s, colored_symbols_s, legal_formats_s, 0, 0, 0, dtutil.dt2ts(d.created_date), normalized_name, colors_s, colored_symbols_s, legal_formats_s]) # If it was worth priming the in-db cache it's worth busting the in-memory cache to pick up the changes. redis.clear(f'decksite:deck:{d.id}')
def prime_cache(d: Deck) -> None: set_colors(d) colors_s = json.dumps(d.colors) colored_symbols_s = json.dumps(d.colored_symbols) set_legality(d) legal_formats_s = json.dumps(list(d.legal_formats)) normalized_name = deck_name.normalize(d) db().begin() db().execute('DELETE FROM deck_cache WHERE deck_id = %s', [d.id]) sql = """ INSERT INTO deck_cache (deck_id, normalized_name, colors, colored_symbols, legal_formats, wins, draws, losses, active_date) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) """ db().execute(sql, [ d.id, normalized_name, colors_s, colored_symbols_s, legal_formats_s, 0, 0, 0, dtutil.dt2ts(d.created_date) ]) db().commit() # If it was worth priming the in-db cache it's worth busting the in-memory cache to pick up the changes. redis.clear(f'decksite:deck:{d.id}')
def subtitle(self): return deck_name.normalize(self._deck)
def test_normalize(): d = Container({ 'original_name': 'Dimir Control', 'archetype': 'Control', 'colors': ['U', 'B'] }) assert deck_name.normalize(d) == 'Dimir Control' d.original_name = 'U/B Control' assert deck_name.normalize(d) == 'Dimir Control' d.original_name = 'dimir control' assert deck_name.normalize(d) == 'Dimir Control' d.original_name = 'U/B Reanimator' assert deck_name.normalize(d) == 'Dimir Reanimator' d.colors = ['B'] d.original_name = 'penny dreadful black lifegain' assert deck_name.normalize(d) == 'Mono Black Lifegain' d.colors = ['G', 'U'] d.original_name = 'biovisionary pd' assert deck_name.normalize(d) == 'Biovisionary' d.colors = ['R'] d.archetype = 'Aggro' d.original_name = 'mono red ashling aggro' assert deck_name.normalize(d) == 'Mono Red Ashling Aggro' d.colors = ['W', 'U', 'B'] d.archetype = 'Unclassified' d.original_name = 'penny dreadful esper mill' assert deck_name.normalize(d) == 'Esper Mill' d.colors = ['W', 'G'] d.archetype = 'Aggro-Combo' d.original_name = 'penny dreadful gw tokens' assert deck_name.normalize(d) == 'Selesnya Tokens' d.colors = ['R', 'G', 'B'] d.archetype = 'Control' d.original_name = 'Jund' assert deck_name.normalize(d) == 'Jund Control' d.archetype = None assert deck_name.normalize(d) == 'Jund' d.colors = ['W', 'G'] d.original_name = 'White Green' d.archetype = 'Aggro' assert deck_name.normalize(d) == 'Selesnya Aggro' d.archetype = None assert deck_name.normalize(d) == 'Selesnya' d.colors = ['R'] d.original_name = 'RDW' assert deck_name.normalize(d) == 'Red Deck Wins' d.original_name = 'Red Deck Wins' assert deck_name.normalize(d) == 'Red Deck Wins' d.colors = ['W'] d.original_name = 'WW' assert deck_name.normalize(d) == 'White Weenie' d.original_name = 'White Weenie' assert deck_name.normalize(d) == 'White Weenie' d.colors = ['B'] d.original_name = '[pd] Mono B Control' assert deck_name.normalize(d) == 'Mono Black Control' d.colors = ['B', 'R'] d.original_name = 'BR Control' assert deck_name.normalize(d) == 'Rakdos Control' d.colors = ['B'] d.original_name = 'b ' assert deck_name.normalize(d) == 'Mono Black' d.colors = ['U'] d.original_name = 'muc' assert deck_name.normalize(d) == 'Mono Blue Control' d.colors = ['R'] d.original_name = 'RDW23' assert deck_name.normalize( d ) == 'Rdw23' # This isn't ideal but see BWWave for why it's probably right. d.colors = ['B'] d.original_name = 'Mono B Aristocrats III' assert deck_name.normalize(d) == 'Mono Black Aristocrats III' d.original_name = 'Mono B Aristocrats VI' assert deck_name.normalize(d) == 'Mono Black Aristocrats VI' d.original_name = 'Suicide Black' assert deck_name.normalize(d) == 'Suicide Black' d.colors = ['R'] d.original_name = 'Penny Dreadful Sunday RDW' assert deck_name.normalize(d) == 'Red Deck Wins' d.original_name = '[Pd][hou] Harvest Quest' assert deck_name.normalize(d) == 'Harvest Quest' d.original_name = 'Pd_Vehicles' assert deck_name.normalize(d) == 'Vehicles' d.original_name = 'better red than dead' assert deck_name.normalize(d) == 'Better Red Than Dead' d.original_name = 'week one rdw' assert deck_name.normalize(d) == 'Week One Red Deck Wins' d.colors = ['U', 'R'] d.original_name = '.ur control' assert deck_name.normalize(d) == 'Izzet Control' d.colors = ['G'] d.original_name = 'mono g aggro' assert deck_name.normalize(d) == 'Mono Green Aggro' d.original_name = 'monog ramp' assert deck_name.normalize(d) == 'Mono Green Ramp' d.original_name = 'Monogreen Creatures' assert deck_name.normalize(d) == 'Mono Green Creatures' d.colors = ['R'] d.original_name = 'S6 red Deck Wins' assert deck_name.normalize(d) == 'Red Deck Wins' d.original_name = 'S6red Deck Wins' assert deck_name.normalize(d) == 'Red Deck Wins' d.colors = ['W'] d.original_name = 'Mono-W Soldiers' assert deck_name.normalize(d) == 'Mono White Soldiers' d.original_name = 'BWWave' assert deck_name.normalize(d) == 'Bwwave' # Not ideal but ok.
def test_normalize(): d = Container({ 'name': 'Dimir Control', 'archetype': 'Control', 'colors': ['U', 'B'] }) assert deck_name.normalize(d) == 'Dimir Control' d.name = 'U/B Control' assert deck_name.normalize(d) == 'Dimir Control' d.name = 'dimir control' assert deck_name.normalize(d) == 'Dimir Control' d.name = 'U/B Reanimator' assert deck_name.normalize(d) == 'Dimir Reanimator' d.colors = ['B'] d.name = 'penny dreadful black lifegain' assert deck_name.normalize(d) == 'Mono Black Lifegain' d.colors = ['G', 'U'] d.name = 'biovisionary pd' assert deck_name.normalize(d) == 'Biovisionary' d.colors = ['R'] d.archetype = 'Aggro' d.name = 'mono red ashling aggro' assert deck_name.normalize(d) == 'Mono Red Ashling Aggro' d.colors = ['W', 'U', 'B'] d.archetype = 'Unclassified' d.name = 'penny dreadful esper mill' assert deck_name.normalize(d) == 'Esper Mill' d.colors = ['W', 'G'] d.archetype = 'Aggro-Combo' d.name = 'penny dreadful gw tokens' assert deck_name.normalize(d) == 'Selesnya Tokens' d.colors = ['R', 'G', 'B'] d.archetype = 'Control' d.name = 'Jund' assert deck_name.normalize(d) == 'Jund Control' d.archetype = None assert deck_name.normalize(d) == 'Jund' d.colors = ['W', 'G'] d.name = 'White Green' d.archetype = 'Aggro' assert deck_name.normalize(d) == 'Selesnya Aggro' d.archetype = None assert deck_name.normalize(d) == 'Selesnya' d.colors = ['R'] d.name = 'RDW' assert deck_name.normalize(d) == 'Red Deck Wins' d.name = 'Red Deck Wins' assert deck_name.normalize(d) == 'Red Deck Wins' d.colors = ['W'] d.name = 'WW' assert deck_name.normalize(d) == 'White Weenie' d.name = 'White Weenie' assert deck_name.normalize(d) == 'White Weenie' d.colors = ['B'] d.name = '[pd] Mono B Control' assert deck_name.normalize(d) == 'Mono Black Control' d.colors = ['B', 'R'] d.name = 'BR Control' assert deck_name.normalize(d) == 'Rakdos Control' d.colors = ['B'] d.name = 'b ' assert deck_name.normalize(d) == 'Mono Black' d.colors = ['U'] d.name = 'muc' assert deck_name.normalize(d) == 'Mono Blue Control' d.colors = ['R'] d.name = 'RDW23' assert deck_name.normalize(d) == 'Red Deck Wins23' d.colors = ['B'] d.name = 'Mono B Aristocrats III' assert deck_name.normalize(d) == 'Mono Black Aristocrats III' d.name = 'Mono B Aristocrats VI' assert deck_name.normalize(d) == 'Mono Black Aristocrats VI' d.name = 'Suicide Black' assert deck_name.normalize(d) == 'Suicide Black' d.colors = ['R'] d.name = 'Penny Dreadful Sunday RDW' assert deck_name.normalize(d) == 'Red Deck Wins' d.name = '[Pd][hou] Harvest Quest' assert deck_name.normalize(d) == 'Harvest Quest' d.name = 'Pd_Vehicles' assert deck_name.normalize(d) == 'Vehicles'