mtg-ssm 2.6.9.dev3__tar.gz → 2.6.10.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/PKG-INFO +16 -6
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/README.rst +15 -5
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/_version.py +2 -2
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/serialization/xlsx.py +18 -9
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm.egg-info/PKG-INFO +16 -6
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/scryfall/test_fetcher.py +1 -1
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/serialization/__snapshots__/test_xlsx.ambr +112 -28
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/serialization/test_csv.py +2 -2
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.editorconfig +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.github/dependabot.yml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.github/workflows/integration.yml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.github/workflows/pre-commit.yml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.github/workflows/publish.yml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.github/workflows/run-tests.yml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.gitignore +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/.pre-commit-config.yaml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/LICENSE.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/TODO.md +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/containers/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/containers/bundles.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/containers/collection.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/containers/counts.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/containers/indexes.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/containers/legacy.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/mtg/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/mtg/util.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/py.typed +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/scryfall/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/scryfall/fetcher.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/scryfall/models.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/serialization/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/serialization/csv.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/serialization/interface.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm/ssm.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm.egg-info/SOURCES.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm.egg-info/dependency_links.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm.egg-info/entry_points.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm.egg-info/requires.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/mtg_ssm.egg-info/top_level.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/pyproject.toml +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/setup.cfg +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/conftest.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/containers/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/containers/test_bundles.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/containers/test_counts.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/containers/test_indexes.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/containers/test_legacy.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/LICENSE.txt +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/bulk_data.json +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/cards.json +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/migrations.json +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/sets.json +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/sets1.json +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/data/sets2.json +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/gen_testdata.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/mtg/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/mtg/test_util.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/scryfall/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/serialization/__init__.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/serialization/__snapshots__/test_csv.ambr +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/serialization/test_interface.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/serialization/test_xlsx.py +0 -0
- {mtg_ssm-2.6.9.dev3 → mtg_ssm-2.6.10.dev1}/tests/test_ssm.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mtg_ssm
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.10.dev1
|
|
4
4
|
Summary: A tool to manage Magic: the Gathering collection spreadsheets
|
|
5
5
|
Author-email: George Leslie-Waksman <waksman@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -223,13 +223,13 @@ Acknowledgments
|
|
|
223
223
|
early '90s.
|
|
224
224
|
- `Scryfall`_: Scryfall is a fantastic resource for anyone trying to lookup
|
|
225
225
|
cards or build software on top of up to date Magic card information.
|
|
226
|
-
- `
|
|
227
|
-
tools around magic card data. Before Scryfall,
|
|
228
|
-
source for card data and, without it, mtg-ssm would
|
|
226
|
+
- `MTGJSON`_: MTGJSON is an amazing resource for anyone looking to build
|
|
227
|
+
tools around magic card data. Before Scryfall, MTGJSON was my primary
|
|
228
|
+
source for card data and, without it, mtg-ssm would have died long ago.
|
|
229
229
|
|
|
230
230
|
.. _Wizards of the Coast: http://magic.wizards.com
|
|
231
231
|
.. _Scryfall: https://scryfall.com
|
|
232
|
-
..
|
|
232
|
+
.. _MTGJSON: http://mtgjson.com
|
|
233
233
|
|
|
234
234
|
|
|
235
235
|
Changelog
|
|
@@ -459,7 +459,7 @@ Development
|
|
|
459
459
|
1.2.3
|
|
460
460
|
-----
|
|
461
461
|
|
|
462
|
-
- Hack to work around missing "releaseDate" and "type" in
|
|
462
|
+
- Hack to work around missing "releaseDate" and "type" in MTGJSON 3.3.14
|
|
463
463
|
|
|
464
464
|
1.2.2
|
|
465
465
|
-----
|
|
@@ -501,3 +501,13 @@ Development
|
|
|
501
501
|
-----
|
|
502
502
|
|
|
503
503
|
- Initial stable release.
|
|
504
|
+
|
|
505
|
+
GsMtgJson
|
|
506
|
+
---------
|
|
507
|
+
|
|
508
|
+
Before mtg-ssm, this tool lived as a Google Apps Script project called
|
|
509
|
+
`GsMtgJson`_. As Magic added more cards, eventually the script became
|
|
510
|
+
too slow to function inside the constraints of Google Apps Script and
|
|
511
|
+
Google Sheets.
|
|
512
|
+
|
|
513
|
+
.. _GsMtgJson: https://github.com/gwax/GsMtgJson
|
|
@@ -162,13 +162,13 @@ Acknowledgments
|
|
|
162
162
|
early '90s.
|
|
163
163
|
- `Scryfall`_: Scryfall is a fantastic resource for anyone trying to lookup
|
|
164
164
|
cards or build software on top of up to date Magic card information.
|
|
165
|
-
- `
|
|
166
|
-
tools around magic card data. Before Scryfall,
|
|
167
|
-
source for card data and, without it, mtg-ssm would
|
|
165
|
+
- `MTGJSON`_: MTGJSON is an amazing resource for anyone looking to build
|
|
166
|
+
tools around magic card data. Before Scryfall, MTGJSON was my primary
|
|
167
|
+
source for card data and, without it, mtg-ssm would have died long ago.
|
|
168
168
|
|
|
169
169
|
.. _Wizards of the Coast: http://magic.wizards.com
|
|
170
170
|
.. _Scryfall: https://scryfall.com
|
|
171
|
-
..
|
|
171
|
+
.. _MTGJSON: http://mtgjson.com
|
|
172
172
|
|
|
173
173
|
|
|
174
174
|
Changelog
|
|
@@ -398,7 +398,7 @@ Development
|
|
|
398
398
|
1.2.3
|
|
399
399
|
-----
|
|
400
400
|
|
|
401
|
-
- Hack to work around missing "releaseDate" and "type" in
|
|
401
|
+
- Hack to work around missing "releaseDate" and "type" in MTGJSON 3.3.14
|
|
402
402
|
|
|
403
403
|
1.2.2
|
|
404
404
|
-----
|
|
@@ -440,3 +440,13 @@ Development
|
|
|
440
440
|
-----
|
|
441
441
|
|
|
442
442
|
- Initial stable release.
|
|
443
|
+
|
|
444
|
+
GsMtgJson
|
|
445
|
+
---------
|
|
446
|
+
|
|
447
|
+
Before mtg-ssm, this tool lived as a Google Apps Script project called
|
|
448
|
+
`GsMtgJson`_. As Magic added more cards, eventually the script became
|
|
449
|
+
too slow to function inside the constraints of Google Apps Script and
|
|
450
|
+
Google Sheets.
|
|
451
|
+
|
|
452
|
+
.. _GsMtgJson: https://github.com/gwax/GsMtgJson
|
|
@@ -12,5 +12,5 @@ __version__: str
|
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
|
13
13
|
version_tuple: VERSION_TUPLE
|
|
14
14
|
|
|
15
|
-
__version__ = version = '2.6.
|
|
16
|
-
__version_tuple__ = version_tuple = (2, 6,
|
|
15
|
+
__version__ = version = '2.6.10.dev1'
|
|
16
|
+
__version_tuple__ = version_tuple = (2, 6, 10, 'dev1')
|
|
@@ -28,15 +28,18 @@ ALL_SETS_SHEET_HEADER: Sequence[str] = [
|
|
|
28
28
|
"release",
|
|
29
29
|
"block",
|
|
30
30
|
"type",
|
|
31
|
-
"
|
|
31
|
+
"printed",
|
|
32
|
+
"have",
|
|
32
33
|
"unique",
|
|
33
34
|
"playsets",
|
|
34
|
-
"
|
|
35
|
+
"extras",
|
|
36
|
+
"nonfoil",
|
|
37
|
+
"foil",
|
|
35
38
|
"value",
|
|
36
39
|
]
|
|
37
40
|
|
|
38
41
|
ALL_SETS_SHEET_TOTALS: Sequence[Optional[str]] = ["Total", None, None, None, None] + [
|
|
39
|
-
f"=SUM({c}3:{c}65535)" for c in "
|
|
42
|
+
f"=SUM({c}3:{c}65535)" for c in "FGHIJKLM"
|
|
40
43
|
]
|
|
41
44
|
|
|
42
45
|
|
|
@@ -64,9 +67,12 @@ def create_all_sets(sheet: Worksheet, index: ScryfallDataIndex) -> None:
|
|
|
64
67
|
card_set.block,
|
|
65
68
|
card_set.set_type.value,
|
|
66
69
|
len(index.setcode_to_cards[card_set.code]),
|
|
70
|
+
f"=SUM('{setcode}'!{_setsheet_col('have')}:{_setsheet_col('have')})",
|
|
67
71
|
f"=COUNTIF('{setcode}'!{_setsheet_col('have')}:{_setsheet_col('have')},\">0\")",
|
|
68
72
|
f"=COUNTIF('{setcode}'!{_setsheet_col('have')}:{_setsheet_col('have')},\">=4\")",
|
|
69
|
-
f"=
|
|
73
|
+
f"=SUMIF('{setcode}'!{_setsheet_col('have')}:{_setsheet_col('have')},\">4\")-4*COUNTIF('{setcode}'!{_setsheet_col('have')}:{_setsheet_col('have')},\">4\")",
|
|
74
|
+
f"=SUM('{setcode}'!{_setsheet_col('nonfoil')}:{_setsheet_col('nonfoil')})",
|
|
75
|
+
f"=SUM('{setcode}'!{_setsheet_col('foil')}:{_setsheet_col('foil')})",
|
|
70
76
|
f"=SUM('{setcode}'!{_setsheet_col('value')}:{_setsheet_col('value')})",
|
|
71
77
|
]
|
|
72
78
|
sheet.append(row)
|
|
@@ -81,11 +87,14 @@ def style_all_sets(sheet: Worksheet) -> None:
|
|
|
81
87
|
("C", 12, True, None),
|
|
82
88
|
("D", 22, True, None),
|
|
83
89
|
("E", 15, True, None),
|
|
84
|
-
("F",
|
|
85
|
-
("G",
|
|
86
|
-
("H",
|
|
87
|
-
("I",
|
|
88
|
-
("J",
|
|
90
|
+
("F", 7, False, None),
|
|
91
|
+
("G", 6, False, None),
|
|
92
|
+
("H", 7, False, None),
|
|
93
|
+
("I", 8, False, None),
|
|
94
|
+
("J", 6, False, None),
|
|
95
|
+
("K", 7, False, None),
|
|
96
|
+
("L", 5, False, None),
|
|
97
|
+
("M", 10, False, FORMAT_CURRENCY_USD_SIMPLE),
|
|
89
98
|
]
|
|
90
99
|
for col, width, hidden, number_format in col_width_hidden_format:
|
|
91
100
|
cdim = sheet.column_dimensions[col]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mtg_ssm
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.10.dev1
|
|
4
4
|
Summary: A tool to manage Magic: the Gathering collection spreadsheets
|
|
5
5
|
Author-email: George Leslie-Waksman <waksman@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -223,13 +223,13 @@ Acknowledgments
|
|
|
223
223
|
early '90s.
|
|
224
224
|
- `Scryfall`_: Scryfall is a fantastic resource for anyone trying to lookup
|
|
225
225
|
cards or build software on top of up to date Magic card information.
|
|
226
|
-
- `
|
|
227
|
-
tools around magic card data. Before Scryfall,
|
|
228
|
-
source for card data and, without it, mtg-ssm would
|
|
226
|
+
- `MTGJSON`_: MTGJSON is an amazing resource for anyone looking to build
|
|
227
|
+
tools around magic card data. Before Scryfall, MTGJSON was my primary
|
|
228
|
+
source for card data and, without it, mtg-ssm would have died long ago.
|
|
229
229
|
|
|
230
230
|
.. _Wizards of the Coast: http://magic.wizards.com
|
|
231
231
|
.. _Scryfall: https://scryfall.com
|
|
232
|
-
..
|
|
232
|
+
.. _MTGJSON: http://mtgjson.com
|
|
233
233
|
|
|
234
234
|
|
|
235
235
|
Changelog
|
|
@@ -459,7 +459,7 @@ Development
|
|
|
459
459
|
1.2.3
|
|
460
460
|
-----
|
|
461
461
|
|
|
462
|
-
- Hack to work around missing "releaseDate" and "type" in
|
|
462
|
+
- Hack to work around missing "releaseDate" and "type" in MTGJSON 3.3.14
|
|
463
463
|
|
|
464
464
|
1.2.2
|
|
465
465
|
-----
|
|
@@ -501,3 +501,13 @@ Development
|
|
|
501
501
|
-----
|
|
502
502
|
|
|
503
503
|
- Initial stable release.
|
|
504
|
+
|
|
505
|
+
GsMtgJson
|
|
506
|
+
---------
|
|
507
|
+
|
|
508
|
+
Before mtg-ssm, this tool lived as a Google Apps Script project called
|
|
509
|
+
`GsMtgJson`_. As Magic added more cards, eventually the script became
|
|
510
|
+
too slow to function inside the constraints of Google Apps Script and
|
|
511
|
+
Google Sheets.
|
|
512
|
+
|
|
513
|
+
.. _GsMtgJson: https://github.com/gwax/GsMtgJson
|
|
@@ -23,7 +23,7 @@ ENDPOINT_TO_FILE: Dict[Union[str, Pattern[str]], Path] = {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
@pytest.fixture
|
|
26
|
+
@pytest.fixture
|
|
27
27
|
def _scryurls(requests_mock: RequestsMock) -> None:
|
|
28
28
|
"""Populate mock responses for scryfall urls."""
|
|
29
29
|
for endpoint, filename in ENDPOINT_TO_FILE.items():
|
|
@@ -71,10 +71,13 @@
|
|
|
71
71
|
'release',
|
|
72
72
|
'block',
|
|
73
73
|
'type',
|
|
74
|
-
'
|
|
74
|
+
'printed',
|
|
75
|
+
'have',
|
|
75
76
|
'unique',
|
|
76
77
|
'playsets',
|
|
77
|
-
'
|
|
78
|
+
'extras',
|
|
79
|
+
'nonfoil',
|
|
80
|
+
'foil',
|
|
78
81
|
'value',
|
|
79
82
|
]),
|
|
80
83
|
list([
|
|
@@ -88,6 +91,9 @@
|
|
|
88
91
|
'=SUM(H3:H65535)',
|
|
89
92
|
'=SUM(I3:I65535)',
|
|
90
93
|
'=SUM(J3:J65535)',
|
|
94
|
+
'=SUM(K3:K65535)',
|
|
95
|
+
'=SUM(L3:L65535)',
|
|
96
|
+
'=SUM(M3:M65535)',
|
|
91
97
|
]),
|
|
92
98
|
list([
|
|
93
99
|
'LEA',
|
|
@@ -96,9 +102,12 @@
|
|
|
96
102
|
'Core Set',
|
|
97
103
|
'core',
|
|
98
104
|
4,
|
|
105
|
+
"=SUM('LEA'!A:A)",
|
|
99
106
|
'=COUNTIF(\'LEA\'!A:A,">0")',
|
|
100
107
|
'=COUNTIF(\'LEA\'!A:A,">=4")',
|
|
101
|
-
|
|
108
|
+
'=SUMIF(\'LEA\'!A:A,">4")-4*COUNTIF(\'LEA\'!A:A,">4")',
|
|
109
|
+
"=SUM('LEA'!I:I)",
|
|
110
|
+
"=SUM('LEA'!J:J)",
|
|
102
111
|
"=SUM('LEA'!B:B)",
|
|
103
112
|
]),
|
|
104
113
|
list([
|
|
@@ -108,9 +117,12 @@
|
|
|
108
117
|
None,
|
|
109
118
|
'expansion',
|
|
110
119
|
4,
|
|
120
|
+
"=SUM('FEM'!A:A)",
|
|
111
121
|
'=COUNTIF(\'FEM\'!A:A,">0")',
|
|
112
122
|
'=COUNTIF(\'FEM\'!A:A,">=4")',
|
|
113
|
-
|
|
123
|
+
'=SUMIF(\'FEM\'!A:A,">4")-4*COUNTIF(\'FEM\'!A:A,">4")',
|
|
124
|
+
"=SUM('FEM'!I:I)",
|
|
125
|
+
"=SUM('FEM'!J:J)",
|
|
114
126
|
"=SUM('FEM'!B:B)",
|
|
115
127
|
]),
|
|
116
128
|
list([
|
|
@@ -120,9 +132,12 @@
|
|
|
120
132
|
'Ice Age',
|
|
121
133
|
'expansion',
|
|
122
134
|
5,
|
|
135
|
+
"=SUM('ICE'!A:A)",
|
|
123
136
|
'=COUNTIF(\'ICE\'!A:A,">0")',
|
|
124
137
|
'=COUNTIF(\'ICE\'!A:A,">=4")',
|
|
125
|
-
|
|
138
|
+
'=SUMIF(\'ICE\'!A:A,">4")-4*COUNTIF(\'ICE\'!A:A,">4")',
|
|
139
|
+
"=SUM('ICE'!I:I)",
|
|
140
|
+
"=SUM('ICE'!J:J)",
|
|
126
141
|
"=SUM('ICE'!B:B)",
|
|
127
142
|
]),
|
|
128
143
|
list([
|
|
@@ -132,9 +147,12 @@
|
|
|
132
147
|
None,
|
|
133
148
|
'starter',
|
|
134
149
|
1,
|
|
150
|
+
"=SUM('S00'!A:A)",
|
|
135
151
|
'=COUNTIF(\'S00\'!A:A,">0")',
|
|
136
152
|
'=COUNTIF(\'S00\'!A:A,">=4")',
|
|
137
|
-
|
|
153
|
+
'=SUMIF(\'S00\'!A:A,">4")-4*COUNTIF(\'S00\'!A:A,">4")',
|
|
154
|
+
"=SUM('S00'!I:I)",
|
|
155
|
+
"=SUM('S00'!J:J)",
|
|
138
156
|
"=SUM('S00'!B:B)",
|
|
139
157
|
]),
|
|
140
158
|
list([
|
|
@@ -144,9 +162,12 @@
|
|
|
144
162
|
'Kamigawa',
|
|
145
163
|
'expansion',
|
|
146
164
|
2,
|
|
165
|
+
"=SUM('CHK'!A:A)",
|
|
147
166
|
'=COUNTIF(\'CHK\'!A:A,">0")',
|
|
148
167
|
'=COUNTIF(\'CHK\'!A:A,">=4")',
|
|
149
|
-
|
|
168
|
+
'=SUMIF(\'CHK\'!A:A,">4")-4*COUNTIF(\'CHK\'!A:A,">4")',
|
|
169
|
+
"=SUM('CHK'!I:I)",
|
|
170
|
+
"=SUM('CHK'!J:J)",
|
|
150
171
|
"=SUM('CHK'!B:B)",
|
|
151
172
|
]),
|
|
152
173
|
list([
|
|
@@ -156,9 +177,12 @@
|
|
|
156
177
|
'Kamigawa',
|
|
157
178
|
'expansion',
|
|
158
179
|
1,
|
|
180
|
+
"=SUM('BOK'!A:A)",
|
|
159
181
|
'=COUNTIF(\'BOK\'!A:A,">0")',
|
|
160
182
|
'=COUNTIF(\'BOK\'!A:A,">=4")',
|
|
161
|
-
|
|
183
|
+
'=SUMIF(\'BOK\'!A:A,">4")-4*COUNTIF(\'BOK\'!A:A,">4")',
|
|
184
|
+
"=SUM('BOK'!I:I)",
|
|
185
|
+
"=SUM('BOK'!J:J)",
|
|
162
186
|
"=SUM('BOK'!B:B)",
|
|
163
187
|
]),
|
|
164
188
|
list([
|
|
@@ -168,9 +192,12 @@
|
|
|
168
192
|
'Kamigawa',
|
|
169
193
|
'expansion',
|
|
170
194
|
1,
|
|
195
|
+
"=SUM('SOK'!A:A)",
|
|
171
196
|
'=COUNTIF(\'SOK\'!A:A,">0")',
|
|
172
197
|
'=COUNTIF(\'SOK\'!A:A,">=4")',
|
|
173
|
-
|
|
198
|
+
'=SUMIF(\'SOK\'!A:A,">4")-4*COUNTIF(\'SOK\'!A:A,">4")',
|
|
199
|
+
"=SUM('SOK'!I:I)",
|
|
200
|
+
"=SUM('SOK'!J:J)",
|
|
174
201
|
"=SUM('SOK'!B:B)",
|
|
175
202
|
]),
|
|
176
203
|
list([
|
|
@@ -180,9 +207,12 @@
|
|
|
180
207
|
None,
|
|
181
208
|
'planechase',
|
|
182
209
|
2,
|
|
210
|
+
"=SUM('HOP'!A:A)",
|
|
183
211
|
'=COUNTIF(\'HOP\'!A:A,">0")',
|
|
184
212
|
'=COUNTIF(\'HOP\'!A:A,">=4")',
|
|
185
|
-
|
|
213
|
+
'=SUMIF(\'HOP\'!A:A,">4")-4*COUNTIF(\'HOP\'!A:A,">4")',
|
|
214
|
+
"=SUM('HOP'!I:I)",
|
|
215
|
+
"=SUM('HOP'!J:J)",
|
|
186
216
|
"=SUM('HOP'!B:B)",
|
|
187
217
|
]),
|
|
188
218
|
list([
|
|
@@ -192,9 +222,12 @@
|
|
|
192
222
|
'Scars of Mirrodin',
|
|
193
223
|
'promo',
|
|
194
224
|
1,
|
|
225
|
+
"=SUM('PMBS'!A:A)",
|
|
195
226
|
'=COUNTIF(\'PMBS\'!A:A,">0")',
|
|
196
227
|
'=COUNTIF(\'PMBS\'!A:A,">=4")',
|
|
197
|
-
|
|
228
|
+
'=SUMIF(\'PMBS\'!A:A,">4")-4*COUNTIF(\'PMBS\'!A:A,">4")',
|
|
229
|
+
"=SUM('PMBS'!I:I)",
|
|
230
|
+
"=SUM('PMBS'!J:J)",
|
|
198
231
|
"=SUM('PMBS'!B:B)",
|
|
199
232
|
]),
|
|
200
233
|
list([
|
|
@@ -204,9 +237,12 @@
|
|
|
204
237
|
'Scars of Mirrodin',
|
|
205
238
|
'expansion',
|
|
206
239
|
2,
|
|
240
|
+
"=SUM('MBS'!A:A)",
|
|
207
241
|
'=COUNTIF(\'MBS\'!A:A,">0")',
|
|
208
242
|
'=COUNTIF(\'MBS\'!A:A,">=4")',
|
|
209
|
-
|
|
243
|
+
'=SUMIF(\'MBS\'!A:A,">4")-4*COUNTIF(\'MBS\'!A:A,">4")',
|
|
244
|
+
"=SUM('MBS'!I:I)",
|
|
245
|
+
"=SUM('MBS'!J:J)",
|
|
210
246
|
"=SUM('MBS'!B:B)",
|
|
211
247
|
]),
|
|
212
248
|
list([
|
|
@@ -216,9 +252,12 @@
|
|
|
216
252
|
None,
|
|
217
253
|
'expansion',
|
|
218
254
|
3,
|
|
255
|
+
"=SUM('NEO'!A:A)",
|
|
219
256
|
'=COUNTIF(\'NEO\'!A:A,">0")',
|
|
220
257
|
'=COUNTIF(\'NEO\'!A:A,">=4")',
|
|
221
|
-
|
|
258
|
+
'=SUMIF(\'NEO\'!A:A,">4")-4*COUNTIF(\'NEO\'!A:A,">4")',
|
|
259
|
+
"=SUM('NEO'!I:I)",
|
|
260
|
+
"=SUM('NEO'!J:J)",
|
|
222
261
|
"=SUM('NEO'!B:B)",
|
|
223
262
|
]),
|
|
224
263
|
list([
|
|
@@ -228,9 +267,12 @@
|
|
|
228
267
|
None,
|
|
229
268
|
'promo',
|
|
230
269
|
2,
|
|
270
|
+
"=SUM('PNEO'!A:A)",
|
|
231
271
|
'=COUNTIF(\'PNEO\'!A:A,">0")',
|
|
232
272
|
'=COUNTIF(\'PNEO\'!A:A,">=4")',
|
|
233
|
-
|
|
273
|
+
'=SUMIF(\'PNEO\'!A:A,">4")-4*COUNTIF(\'PNEO\'!A:A,">4")',
|
|
274
|
+
"=SUM('PNEO'!I:I)",
|
|
275
|
+
"=SUM('PNEO'!J:J)",
|
|
234
276
|
"=SUM('PNEO'!B:B)",
|
|
235
277
|
]),
|
|
236
278
|
])
|
|
@@ -325,10 +367,13 @@
|
|
|
325
367
|
'release',
|
|
326
368
|
'block',
|
|
327
369
|
'type',
|
|
328
|
-
'
|
|
370
|
+
'printed',
|
|
371
|
+
'have',
|
|
329
372
|
'unique',
|
|
330
373
|
'playsets',
|
|
331
|
-
'
|
|
374
|
+
'extras',
|
|
375
|
+
'nonfoil',
|
|
376
|
+
'foil',
|
|
332
377
|
'value',
|
|
333
378
|
]),
|
|
334
379
|
list([
|
|
@@ -342,6 +387,9 @@
|
|
|
342
387
|
'=SUM(H3:H65535)',
|
|
343
388
|
'=SUM(I3:I65535)',
|
|
344
389
|
'=SUM(J3:J65535)',
|
|
390
|
+
'=SUM(K3:K65535)',
|
|
391
|
+
'=SUM(L3:L65535)',
|
|
392
|
+
'=SUM(M3:M65535)',
|
|
345
393
|
]),
|
|
346
394
|
list([
|
|
347
395
|
'LEA',
|
|
@@ -350,9 +398,12 @@
|
|
|
350
398
|
'Core Set',
|
|
351
399
|
'core',
|
|
352
400
|
4,
|
|
401
|
+
"=SUM('LEA'!A:A)",
|
|
353
402
|
'=COUNTIF(\'LEA\'!A:A,">0")',
|
|
354
403
|
'=COUNTIF(\'LEA\'!A:A,">=4")',
|
|
355
|
-
|
|
404
|
+
'=SUMIF(\'LEA\'!A:A,">4")-4*COUNTIF(\'LEA\'!A:A,">4")',
|
|
405
|
+
"=SUM('LEA'!I:I)",
|
|
406
|
+
"=SUM('LEA'!J:J)",
|
|
356
407
|
"=SUM('LEA'!B:B)",
|
|
357
408
|
]),
|
|
358
409
|
list([
|
|
@@ -362,9 +413,12 @@
|
|
|
362
413
|
None,
|
|
363
414
|
'expansion',
|
|
364
415
|
4,
|
|
416
|
+
"=SUM('FEM'!A:A)",
|
|
365
417
|
'=COUNTIF(\'FEM\'!A:A,">0")',
|
|
366
418
|
'=COUNTIF(\'FEM\'!A:A,">=4")',
|
|
367
|
-
|
|
419
|
+
'=SUMIF(\'FEM\'!A:A,">4")-4*COUNTIF(\'FEM\'!A:A,">4")',
|
|
420
|
+
"=SUM('FEM'!I:I)",
|
|
421
|
+
"=SUM('FEM'!J:J)",
|
|
368
422
|
"=SUM('FEM'!B:B)",
|
|
369
423
|
]),
|
|
370
424
|
list([
|
|
@@ -374,9 +428,12 @@
|
|
|
374
428
|
'Ice Age',
|
|
375
429
|
'expansion',
|
|
376
430
|
5,
|
|
431
|
+
"=SUM('ICE'!A:A)",
|
|
377
432
|
'=COUNTIF(\'ICE\'!A:A,">0")',
|
|
378
433
|
'=COUNTIF(\'ICE\'!A:A,">=4")',
|
|
379
|
-
|
|
434
|
+
'=SUMIF(\'ICE\'!A:A,">4")-4*COUNTIF(\'ICE\'!A:A,">4")',
|
|
435
|
+
"=SUM('ICE'!I:I)",
|
|
436
|
+
"=SUM('ICE'!J:J)",
|
|
380
437
|
"=SUM('ICE'!B:B)",
|
|
381
438
|
]),
|
|
382
439
|
list([
|
|
@@ -386,9 +443,12 @@
|
|
|
386
443
|
None,
|
|
387
444
|
'starter',
|
|
388
445
|
1,
|
|
446
|
+
"=SUM('S00'!A:A)",
|
|
389
447
|
'=COUNTIF(\'S00\'!A:A,">0")',
|
|
390
448
|
'=COUNTIF(\'S00\'!A:A,">=4")',
|
|
391
|
-
|
|
449
|
+
'=SUMIF(\'S00\'!A:A,">4")-4*COUNTIF(\'S00\'!A:A,">4")',
|
|
450
|
+
"=SUM('S00'!I:I)",
|
|
451
|
+
"=SUM('S00'!J:J)",
|
|
392
452
|
"=SUM('S00'!B:B)",
|
|
393
453
|
]),
|
|
394
454
|
list([
|
|
@@ -398,9 +458,12 @@
|
|
|
398
458
|
'Kamigawa',
|
|
399
459
|
'expansion',
|
|
400
460
|
2,
|
|
461
|
+
"=SUM('CHK'!A:A)",
|
|
401
462
|
'=COUNTIF(\'CHK\'!A:A,">0")',
|
|
402
463
|
'=COUNTIF(\'CHK\'!A:A,">=4")',
|
|
403
|
-
|
|
464
|
+
'=SUMIF(\'CHK\'!A:A,">4")-4*COUNTIF(\'CHK\'!A:A,">4")',
|
|
465
|
+
"=SUM('CHK'!I:I)",
|
|
466
|
+
"=SUM('CHK'!J:J)",
|
|
404
467
|
"=SUM('CHK'!B:B)",
|
|
405
468
|
]),
|
|
406
469
|
list([
|
|
@@ -410,9 +473,12 @@
|
|
|
410
473
|
'Kamigawa',
|
|
411
474
|
'expansion',
|
|
412
475
|
1,
|
|
476
|
+
"=SUM('BOK'!A:A)",
|
|
413
477
|
'=COUNTIF(\'BOK\'!A:A,">0")',
|
|
414
478
|
'=COUNTIF(\'BOK\'!A:A,">=4")',
|
|
415
|
-
|
|
479
|
+
'=SUMIF(\'BOK\'!A:A,">4")-4*COUNTIF(\'BOK\'!A:A,">4")',
|
|
480
|
+
"=SUM('BOK'!I:I)",
|
|
481
|
+
"=SUM('BOK'!J:J)",
|
|
416
482
|
"=SUM('BOK'!B:B)",
|
|
417
483
|
]),
|
|
418
484
|
list([
|
|
@@ -422,9 +488,12 @@
|
|
|
422
488
|
'Kamigawa',
|
|
423
489
|
'expansion',
|
|
424
490
|
1,
|
|
491
|
+
"=SUM('SOK'!A:A)",
|
|
425
492
|
'=COUNTIF(\'SOK\'!A:A,">0")',
|
|
426
493
|
'=COUNTIF(\'SOK\'!A:A,">=4")',
|
|
427
|
-
|
|
494
|
+
'=SUMIF(\'SOK\'!A:A,">4")-4*COUNTIF(\'SOK\'!A:A,">4")',
|
|
495
|
+
"=SUM('SOK'!I:I)",
|
|
496
|
+
"=SUM('SOK'!J:J)",
|
|
428
497
|
"=SUM('SOK'!B:B)",
|
|
429
498
|
]),
|
|
430
499
|
list([
|
|
@@ -434,9 +503,12 @@
|
|
|
434
503
|
None,
|
|
435
504
|
'planechase',
|
|
436
505
|
2,
|
|
506
|
+
"=SUM('HOP'!A:A)",
|
|
437
507
|
'=COUNTIF(\'HOP\'!A:A,">0")',
|
|
438
508
|
'=COUNTIF(\'HOP\'!A:A,">=4")',
|
|
439
|
-
|
|
509
|
+
'=SUMIF(\'HOP\'!A:A,">4")-4*COUNTIF(\'HOP\'!A:A,">4")',
|
|
510
|
+
"=SUM('HOP'!I:I)",
|
|
511
|
+
"=SUM('HOP'!J:J)",
|
|
440
512
|
"=SUM('HOP'!B:B)",
|
|
441
513
|
]),
|
|
442
514
|
list([
|
|
@@ -446,9 +518,12 @@
|
|
|
446
518
|
'Scars of Mirrodin',
|
|
447
519
|
'promo',
|
|
448
520
|
1,
|
|
521
|
+
"=SUM('PMBS'!A:A)",
|
|
449
522
|
'=COUNTIF(\'PMBS\'!A:A,">0")',
|
|
450
523
|
'=COUNTIF(\'PMBS\'!A:A,">=4")',
|
|
451
|
-
|
|
524
|
+
'=SUMIF(\'PMBS\'!A:A,">4")-4*COUNTIF(\'PMBS\'!A:A,">4")',
|
|
525
|
+
"=SUM('PMBS'!I:I)",
|
|
526
|
+
"=SUM('PMBS'!J:J)",
|
|
452
527
|
"=SUM('PMBS'!B:B)",
|
|
453
528
|
]),
|
|
454
529
|
list([
|
|
@@ -458,9 +533,12 @@
|
|
|
458
533
|
'Scars of Mirrodin',
|
|
459
534
|
'expansion',
|
|
460
535
|
2,
|
|
536
|
+
"=SUM('MBS'!A:A)",
|
|
461
537
|
'=COUNTIF(\'MBS\'!A:A,">0")',
|
|
462
538
|
'=COUNTIF(\'MBS\'!A:A,">=4")',
|
|
463
|
-
|
|
539
|
+
'=SUMIF(\'MBS\'!A:A,">4")-4*COUNTIF(\'MBS\'!A:A,">4")',
|
|
540
|
+
"=SUM('MBS'!I:I)",
|
|
541
|
+
"=SUM('MBS'!J:J)",
|
|
464
542
|
"=SUM('MBS'!B:B)",
|
|
465
543
|
]),
|
|
466
544
|
list([
|
|
@@ -470,9 +548,12 @@
|
|
|
470
548
|
None,
|
|
471
549
|
'expansion',
|
|
472
550
|
3,
|
|
551
|
+
"=SUM('NEO'!A:A)",
|
|
473
552
|
'=COUNTIF(\'NEO\'!A:A,">0")',
|
|
474
553
|
'=COUNTIF(\'NEO\'!A:A,">=4")',
|
|
475
|
-
|
|
554
|
+
'=SUMIF(\'NEO\'!A:A,">4")-4*COUNTIF(\'NEO\'!A:A,">4")',
|
|
555
|
+
"=SUM('NEO'!I:I)",
|
|
556
|
+
"=SUM('NEO'!J:J)",
|
|
476
557
|
"=SUM('NEO'!B:B)",
|
|
477
558
|
]),
|
|
478
559
|
list([
|
|
@@ -482,9 +563,12 @@
|
|
|
482
563
|
None,
|
|
483
564
|
'promo',
|
|
484
565
|
2,
|
|
566
|
+
"=SUM('PNEO'!A:A)",
|
|
485
567
|
'=COUNTIF(\'PNEO\'!A:A,">0")',
|
|
486
568
|
'=COUNTIF(\'PNEO\'!A:A,">=4")',
|
|
487
|
-
|
|
569
|
+
'=SUMIF(\'PNEO\'!A:A,">4")-4*COUNTIF(\'PNEO\'!A:A,">4")',
|
|
570
|
+
"=SUM('PNEO'!I:I)",
|
|
571
|
+
"=SUM('PNEO'!J:J)",
|
|
488
572
|
"=SUM('PNEO'!B:B)",
|
|
489
573
|
]),
|
|
490
574
|
])
|
|
@@ -32,14 +32,14 @@ def oracle(scryfall_data: ScryfallDataSet) -> Oracle:
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def test_header() -> None:
|
|
35
|
-
assert [
|
|
35
|
+
assert csv.CSV_HEADER == [
|
|
36
36
|
"set",
|
|
37
37
|
"name",
|
|
38
38
|
"collector_number",
|
|
39
39
|
"scryfall_id",
|
|
40
40
|
"nonfoil",
|
|
41
41
|
"foil",
|
|
42
|
-
]
|
|
42
|
+
]
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
def test_row_for_card(id_to_card: Dict[UUID, ScryCard]) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|