def test_base_query_legalities() -> None:
    sql = multiverse.base_query("f.name = 'Mother of Runes'")
    rs = db().execute(sql)
    assert len(rs) == 1
    legalities = rs[0]['legalities']
    assert 'Penny Dreadful EMN:Legal' in legalities
    assert 'Penny Dreadful AKH:Legal' not in legalities
def test_base_query_legalities() -> None:
    sql = multiverse.base_query("f.name = 'Mother of Runes'")
    db().execute('SET group_concat_max_len=100000')
    rs = db().select(sql)
    assert len(rs) == 1
    legalities = rs[0]['legalities']
    assert 'Penny Dreadful EMN:Legal' in legalities
    assert 'Penny Dreadful AKH:Legal' not in legalities
Exemplo n.º 3
0
def search(query):
    like_query = '%{query}%'.format(query=card.canonicalize(query))
    sql = """
        {base_query}
        HAVING name_ascii LIKE %s OR names LIKE %s
        ORDER BY pd_legal DESC, name
    """.format(base_query=multiverse.base_query())
    rs = db().execute(sql, [like_query, like_query])
    return [card.Card(r) for r in rs]
Exemplo n.º 4
0
def legal_cards(force=False):
    if len(LEGAL_CARDS) == 0 or force:
        new_list = multiverse.set_legal_cards(force)
        if new_list is None:
            sql = 'SELECT bq.name FROM ({base_query}) AS bq WHERE bq.id IN (SELECT card_id FROM card_legality WHERE format_id = {format_id})'.format(
                base_query=multiverse.base_query(),
                format_id=multiverse.get_format_id('Penny Dreadful'))
            new_list = [row['name'] for row in db().execute(sql)]
        LEGAL_CARDS.clear()
        for name in new_list:
            LEGAL_CARDS.append(name)
    return LEGAL_CARDS
Exemplo n.º 5
0
def name_lookup(name):
    if name == 'Kongming, Sleeping Dragon':
        name = 'Kongming, "Sleeping Dragon"'
    elif name == 'Pang Tong, Young Phoenix':
        name = 'Pang Tong, "Young Phoenix"'
    if not CARDS:
        rs = db().execute(multiverse.base_query())
        for row in rs:
            CARDS[card.canonicalize(row['name'])] = row['name']
    canonical = card.canonicalize(name)
    if canonical not in CARDS:
        raise InvalidDataException("Bogus name {name} ({canonical}) found.".format(name=name, canonical=canonical))
    return CARDS[canonical]
Exemplo n.º 6
0
def load_cards(names=None):
    if names:
        names = set(names)
    if names:
        names_clause = 'HAVING LOWER({name_query}) IN ({names})'.format(name_query=card.name_query().format(table='u'), names=', '.join(sqlescape(name).lower() for name in names))
    else:
        names_clause = ''
    sql = """
        {base_query}
        {names_clause}
    """.format(base_query=base_query(), names_clause=names_clause)
    rs = db().execute(sql)
    if names and len(names) != len(rs):
        missing = names.symmetric_difference([r['name'] for r in rs])
        raise TooFewItemsException('Expected `{namelen}` and got `{rslen}` with `{names}`.  missing=`{missing}`'.format(namelen=len(names), rslen=len(rs), names=names, missing=missing))
    return [card.Card(r) for r in rs]
Exemplo n.º 7
0
def search(query, fuzzy_threshold=260):
    query = card.canonicalize(query)
    like_query = '%{query}%'.format(query=query)
    if db().is_mysql():
        having = 'name_ascii LIKE ? OR names LIKE ?'
        args = [like_query, like_query]
    else:
        having = """LOWER({name_query}) IN (SELECT word FROM fuzzy WHERE word MATCH ? AND distance <= {fuzzy_threshold})
            OR {name_ascii_query} LIKE ?
            OR SUM(CASE WHEN LOWER(face_name) IN (SELECT word FROM fuzzy WHERE word MATCH ? AND distance <= {fuzzy_threshold}) THEN 1 ELSE 0 END) > 0
        """.format(name_query=card.name_query().format(table='u'), name_ascii_query=card.name_query('name_ascii').format(table='u'), fuzzy_threshold=fuzzy_threshold)
        fuzzy_query = '{query}*'.format(query=query)
        args = [fuzzy_query, like_query, fuzzy_query]
    sql = """
        {base_query}
        HAVING {having}
        ORDER BY pd_legal DESC, name
    """.format(base_query=base_query(), having=having)
    rs = db().execute(sql, args)
    return [card.Card(r) for r in rs]
Exemplo n.º 8
0
def name_lookup(name: str) -> str:
    if name == 'Kongming, Sleeping Dragon':
        name = 'Kongming, "Sleeping Dragon"'
    elif name == 'Pang Tong, Young Phoenix':
        name = 'Pang Tong, "Young Phoenix"'
    try:
        if not CARDS:
            rs = db().select(multiverse.base_query())
            for row in rs:
                CARDS[card.canonicalize(row['name'])] = row['name']
    except DatabaseException:
        tb = traceback.format_exc()
        print(tb)
        if not CARDS:
            CARDS[
                ''] = ''  # Filler, so that we don't try to do this every lookup.

    canonical = card.canonicalize(name)
    if canonical not in CARDS:
        if CARDS.get('', None) is None:
            print('WARNING: Bogus name {name} ({canonical}) found.'.format(
                name=name, canonical=canonical))
        return name
    return CARDS[canonical]
Exemplo n.º 9
0
def bugged_cards():
    sql = base_query() + "HAVING bug_desc IS NOT NULL"
    rs = db().execute(sql)
    return [card.Card(r) for r in rs]