Skip to content

Commit

Permalink
Merge branch 'spring_cleaning'
Browse files Browse the repository at this point in the history
  • Loading branch information
gwax committed Feb 19, 2016
2 parents 00b36b6 + 51cb855 commit 9794df3
Show file tree
Hide file tree
Showing 15 changed files with 104 additions and 128 deletions.
5 changes: 3 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ script: |
if [ "${TEST_SUITE}" = "test" ]; then
py.test --cov=mtg_ssm --strict -r w tests;
elif [ "${TEST_SUITE}" = "lint" ]; then
pylint --rcfile=pylintrc mtg_ssm;
pylint --rcfile=pylintrc --disable=similarities tests;
pylint --rcfile=pylintrc mtg_ssm tests;
flake8 --ignore=E501,F401,F841 *.py mtg_ssm tests;
else
error_without_calling_exit;
fi
# - pandoc --from=markdown --to=rst README.md | diff DESCRIPTION.rst -

Expand Down
4 changes: 3 additions & 1 deletion DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
mtg\_ssm - Magic: the Gathering Spreadsheet Manager
===================================================

|Build Status|
|Build Status| |Coverage Status|

This is a tool for creating/updating user-friendly spreadsheets with
Magic: the Gathering collection information. The tool can also
Expand Down Expand Up @@ -98,3 +98,5 @@ Acknowledgments

.. |Build Status| image:: https://travis-ci.org/gwax/mtg_ssm.svg?branch=master
:target: https://travis-ci.org/gwax/mtg_ssm
.. |Coverage Status| image:: https://coveralls.io/repos/github/gwax/mtg_ssm/badge.svg?branch=master
:target: https://coveralls.io/github/gwax/mtg_ssm?branch=master
14 changes: 4 additions & 10 deletions mtg_ssm/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class CardPrinting(Base):
name='uix_card_set_number_mvid'),
{})

id = sqla.Column(sqla.String(40), primary_key=True)
id_ = sqla.Column(sqla.String(40), primary_key=True)
card_name = sqla.Column(sqla.ForeignKey('cards.name'))
set_code = sqla.Column(sqla.ForeignKey('sets.code'))

Expand All @@ -60,12 +60,11 @@ class CardPrinting(Base):
set = sqlo.relationship('CardSet', lazy='subquery')
collection_counts = sqlo.relationship(
'CollectionCount', lazy='subquery',
collection_class=sqlc.attribute_mapped_collection('key'),
collection_class=sqlc.attribute_mapped_collection('type'),
cascade='all, delete-orphan')
counts = sqlpxy.association_proxy(
'collection_counts', 'count',
creator=lambda k, v: CollectionCount(
type=getattr(CountTypes, k), count=v))
creator=lambda k, v: CollectionCount(type=k, count=v))


class CardSet(Base):
Expand Down Expand Up @@ -100,11 +99,6 @@ class CollectionCount(Base):
"""Model for storing information about collected printings."""
__tablename__ = 'collection_counts'

print_id = sqla.Column(sqla.ForeignKey('printings.id'), primary_key=True)
print_id = sqla.Column(sqla.ForeignKey('printings.id_'), primary_key=True)
type = sqla.Column(util.SqlEnumType(CountTypes), primary_key=True)
count = sqla.Column(sqla.Integer, nullable=False)

@property
def key(self):
"""Model key for use in associationproxy relationships."""
return self.type.name
4 changes: 2 additions & 2 deletions mtg_ssm/mtgjson/mtgjson.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def update_models(session, mtg_data, include_online_only):
if card_data['id'] not in seen_printing_ids:
printing = create_printing(card_data, set_data['code'])
session.add(printing)
seen_printing_ids.add(printing.id)
seen_printing_ids.add(printing.id_)


def create_set(set_data):
Expand All @@ -60,7 +60,7 @@ def create_card(card_data):

def create_printing(card_data, set_code):
"""Given card data, create a CardPrinting."""
printing = models.CardPrinting(id=card_data['id'])
printing = models.CardPrinting(id_=card_data['id'])
printing.card_name = card_data['name']
printing.set_code = set_code
printing.set_number = card_data.get('number')
Expand Down
15 changes: 9 additions & 6 deletions mtg_ssm/serialization/mtgcsv.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def header():
'multiverseid',
'mtgjid',
]
headers.extend(models.CountTypes.__members__.keys())
headers.extend(ct.name for ct in models.CountTypes)
return headers


Expand All @@ -29,9 +29,11 @@ def dump_rows(session):
'set': card_set.code, 'name': printing.card.name,
'number': printing.set_number,
'multiverseid': printing.multiverseid,
'mtgjid': printing.id,
'mtgjid': printing.id_,
}
card_info.update(printing.counts)
for counttype, count in printing.counts.items():
if count:
card_info[counttype.name] = count
yield card_info


Expand All @@ -54,9 +56,10 @@ def process_row_dict(row_dict):
'multiverseid': int_or_none(row_dict['multiverseid']),
'id': row_dict.get('mtgjid'),
}
for countype in models.CountTypes.__members__.keys():
if countype in row_dict:
card_dict[countype] = int_or_none(row_dict[countype])
for counttype in models.CountTypes:
countname = counttype.name
if countname in row_dict:
card_dict[countname] = int_or_none(row_dict[countname])
return card_dict


Expand Down
12 changes: 6 additions & 6 deletions mtg_ssm/serialization/mtgdict.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def load_counts(session, card_dicts):
name = printing.card_name
mvid = printing.multiverseid
num = printing.set_number
id_to_print[printing.id] = printing
id_to_print[printing.id_] = printing
set_name_num_mv_to_prints[(set_code, name, num, mvid)].append(printing)
set_name_mv_to_prints[(set_code, name, mvid)].append(printing)
set_name_num_to_prints[(set_code, name, num)].append(printing)
Expand All @@ -75,9 +75,9 @@ def load_counts(session, card_dicts):
card_dict, id_to_print, set_name_num_mv_to_prints,
set_name_mv_to_prints, set_name_num_to_prints)

for key in models.CountTypes.__members__.keys():
count = card_dict.get(key)
for counttype in models.CountTypes:
count = card_dict.get(counttype.name)
if count is not None:
printing.counts[key] = count
elif printing is not None and key in printing.counts:
del printing.counts[key]
printing.counts[counttype] = count
elif printing is not None and counttype in printing.counts:
del printing.counts[counttype]
8 changes: 4 additions & 4 deletions mtg_ssm/serialization/mtgxlsx.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ def get_other_print_references(printing, name_to_prints):
return other_print_references


COUNT_KEYS = list(models.CountTypes.__members__.keys())
COUNT_KEYS = [ct.name for ct in models.CountTypes]
CARDS_SHEET_HEADER = (
['have', 'name', 'id', 'multiverseid', 'number', 'artist'] +
COUNT_KEYS + ['others'])
Expand All @@ -157,13 +157,13 @@ def create_cards_sheet(sheet, card_set, name_to_prints):
row = [
HAVE_TMPL.format(rownum),
printing.card.name,
printing.id,
printing.id_,
printing.multiverseid,
printing.set_number,
printing.artist,
]
for key in COUNT_KEYS:
row.append(printing.counts.get(key))
for counttype in models.CountTypes:
row.append(printing.counts.get(counttype))
row.append(get_other_print_references(printing, name_to_prints))
sheet.append(row)

Expand Down
16 changes: 1 addition & 15 deletions pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,13 @@ output-format=colorized
# not require a docstring.
no-docstring-rgx=__.*__|test_.*|.*Test|setUp.*|tearDown.*

# Regular expression matching correct method names
method-rgx=([a-z_][a-z0-9_]{2,30}|assert[A-Z][a-zA-Z]{2,24}|test_[a-z_][a-z0-9_]{2,40})$

# Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__)|id)$

[FORMAT]
# Maximum number of characters on a single line.
max-line-length=80

[TYPECHECK]
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E0201 when accessed. Python regular
# expressions are accepted.
generated-members=metadata,__table__,__members__
generated-members=metadata

[VARIABLES]
# A regular expression matching the name of dummy variables (i.e. expectedly
# not used).
dummy-variables-rgx=(_|_[a-z][a-z0-9_]{2,30})$

[DESIGN]
# Argument names that match this expression will be ignored.
ignored-argument-names=(_|_[a-z][a-z0-9_]{2,30})$
43 changes: 21 additions & 22 deletions tests/db/models_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@ class ModelsTest(sqlite_testcase.SqliteTestCase):

def setUp(self):
super().setUp()
connection = self.engine.connect()
models.Base.metadata.create_all(connection)
connection.close()
models.Base.metadata.create_all(self.connection)

def test_set_integer_variant(self):
# Setup
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='123abc',
id_='A', card_name='Bar', set_code='F', set_number='123abc',
multiverseid=27, artist='Quux')
self.session.add_all([card_set, card, printing])
self.session.commit()
Expand All @@ -35,7 +33,7 @@ def test_set_integer_variant_null(self):
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number=None,
id_='A', card_name='Bar', set_code='F', set_number=None,
multiverseid=None, artist='Quux')
self.session.add_all([card_set, card, printing])
self.session.commit()
Expand All @@ -45,12 +43,12 @@ def test_set_integer_variant_null(self):
self.assertEqual(None, printing.set_integer)
self.assertEqual(None, printing.set_variant)

def test_set_integer_variant_nonascii_prefix(self):
def test_variant_nonascii_prefix(self):
# Setup
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='★107',
id_='A', card_name='Bar', set_code='F', set_number='★107',
multiverseid=27, artist='Quux')
self.session.add_all([card_set, card, printing])
self.session.commit()
Expand All @@ -65,34 +63,34 @@ def test_counts_read(self):
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='123abc',
id_='A', card_name='Bar', set_code='F', set_number='123abc',
multiverseid=27, artist='Quux')
count = models.CollectionCount(
print_id='A', type=models.CountTypes.copies, count=5)
self.session.add_all([card_set, card, printing, count])
self.session.commit()

# Verify
self.assertEqual(5, printing.collection_counts['copies'].count)
self.assertEqual(5, printing.counts['copies'])
self.assertEqual(5, printing.collection_counts[models.CountTypes.copies].count)
self.assertEqual(5, printing.counts[models.CountTypes.copies])
with self.assertRaises(KeyError):
_ = printing.counts['foils']
_ = printing.counts[models.CountTypes.foils]

def test_counts_write(self):
# Setup
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='123abc',
id_='A', card_name='Bar', set_code='F', set_number='123abc',
multiverseid=27, artist='Quux')
count = models.CollectionCount(
print_id='A', type=models.CountTypes.copies, count=5)
self.session.add_all([card_set, card, printing, count])
self.session.commit()

# Execute
printing.counts['copies'] = 2
printing.counts['foils'] = 7
printing.counts[models.CountTypes.copies] = 2
printing.counts[models.CountTypes.foils] = 7
self.session.commit()

# Verify
Expand All @@ -109,47 +107,48 @@ def test_invalid_counts_key(self):
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='123abc',
id_='A', card_name='Bar', set_code='F', set_number='123abc',
multiverseid=27, artist='Quux')
self.session.add_all([card_set, card, printing])
self.session.commit()

# Execute
with self.assertRaises(AttributeError):
printing.counts['invalid'] = 12
with self.assertRaises(sqlx.IntegrityError):
printing.counts[None] = 12
self.session.commit()

def test_invalid_counts_value(self):
# Setup
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='123abc',
id_='A', card_name='Bar', set_code='F', set_number='123abc',
multiverseid=27, artist='Quux')
self.session.add_all([card_set, card, printing])
self.session.commit()

# Execute
with self.assertRaises(sqlx.IntegrityError):
printing.counts['copies'] = None
printing.counts[models.CountTypes.copies] = None
self.session.commit()

def test_counts_delete(self):
# Setup
card_set = models.CardSet(code='F', name='Foo')
card = models.Card(name='Bar')
printing = models.CardPrinting(
id='A', card_name='Bar', set_code='F', set_number='123abc',
id_='A', card_name='Bar', set_code='F', set_number='123abc',
multiverseid=27, artist='Quux')
count = models.CollectionCount(
print_id='A', type=models.CountTypes.copies, count=5)
self.session.add_all([card_set, card, printing, count])
self.session.commit()

# Execute
del printing.counts['copies']
del printing.counts[models.CountTypes.copies]
self.session.commit()

# Verify
self.assertEqual({}, printing.counts)
with self.assertRaises(KeyError):
_ = printing.counts['copies']
_ = printing.counts[models.CountTypes.copies]
1 change: 1 addition & 0 deletions tests/db/sqlite_testcase.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def setUp(self):

self.sessionmaker = sqlalchemy.orm.sessionmaker(self.engine)
self.session = self.__session = self.sessionmaker()
self.connection = self.session.connection()

def tearDown(self):
self.__session.close()
Expand Down
Loading

0 comments on commit 9794df3

Please sign in to comment.