spells-mtg 0.10.7__py3-none-any.whl → 0.10.9__py3-none-any.whl

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.

Potentially problematic release.


This version of spells-mtg might be problematic. Click here for more details.

spells/cache.py CHANGED
@@ -10,10 +10,17 @@ Caches are cleared per-set when new files are downloaded.
10
10
  from enum import StrEnum
11
11
  import os
12
12
  import sys
13
-
14
13
  import polars as pl
15
14
 
16
15
 
16
+ class Env(StrEnum):
17
+ PROD = "prod"
18
+ TEST = "test"
19
+
20
+
21
+ env = Env.PROD
22
+
23
+
17
24
  class EventType(StrEnum):
18
25
  PREMIER = "PremierDraft"
19
26
  TRADITIONAL = "TradDraft"
@@ -28,8 +35,30 @@ def spells_print(mode, content):
28
35
  print(f" 🪄 {mode} ✨ {content}")
29
36
 
30
37
 
38
+ def set_test_env():
39
+ global env
40
+ env = Env.TEST
41
+
42
+
43
+ def set_prod_env():
44
+ global env
45
+ env = Env.PROD
46
+
47
+
31
48
  def data_home() -> str:
32
49
  is_win = sys.platform == "win32"
50
+ global env
51
+
52
+ if env == Env.TEST:
53
+ return os.path.expanduser(
54
+ os.environ.get(
55
+ "SPELLS_TEST_HOME",
56
+ r"~\AppData\Local\SpellsTest"
57
+ if is_win
58
+ else "~/.local/share/spellstest/",
59
+ )
60
+ )
61
+
33
62
  return os.path.expanduser(
34
63
  os.environ.get(
35
64
  "SPELLS_DATA_HOME",
@@ -41,6 +70,46 @@ def data_home() -> str:
41
70
  )
42
71
 
43
72
 
73
+ def create_test_data(set_code: str, test_num_drafts: int = 100):
74
+ """
75
+ run from prod environment to write test data for `set_code` into
76
+ the test environment. Then set `SPELLS_DATA_HOME=test_data_home`
77
+ to run from the test environment
78
+ """
79
+
80
+ context_df = pl.scan_parquet(data_file_path(set_code, "context")).collect()
81
+ picks_per_pack = context_df["picks_per_pack"][0]
82
+
83
+ draft_df = (
84
+ pl.scan_parquet(data_file_path(set_code, "draft"))
85
+ .head(50 * (test_num_drafts + 2))
86
+ .collect()
87
+ )
88
+
89
+ sample_draft_ids = (
90
+ draft_df.group_by("draft_id")
91
+ .len()
92
+ .filter(pl.col("len") == picks_per_pack * 3)["draft_id"][0:test_num_drafts]
93
+ )
94
+
95
+ draft_sample_df = draft_df.filter(pl.col("draft_id").is_in(sample_draft_ids))
96
+ game_sample_df = (
97
+ pl.scan_parquet(data_file_path(set_code, "game"))
98
+ .filter(pl.col("draft_id").is_in(sample_draft_ids))
99
+ .collect()
100
+ )
101
+ card_df = pl.scan_parquet(data_file_path(set_code, "card")).collect()
102
+
103
+ set_test_env()
104
+ if not os.path.isdir(set_dir := external_set_path(set_code)):
105
+ os.makedirs(set_dir)
106
+ context_df.write_parquet(data_file_path(set_code, "context"))
107
+ draft_sample_df.write_parquet(data_file_path(set_code, "draft"))
108
+ game_sample_df.write_parquet(data_file_path(set_code, "game"))
109
+ card_df.write_parquet(data_file_path(set_code, "card"))
110
+ set_prod_env()
111
+
112
+
44
113
  def data_dir_path(cache_dir: DataDir) -> str:
45
114
  """
46
115
  Where 17Lands data is stored. MDU_DATA_DIR environment variable is used, if it exists,
spells/columns.py CHANGED
@@ -166,6 +166,10 @@ _specs: dict[str, ColSpec] = {
166
166
  col_type=ColType.GROUP_BY,
167
167
  expr=pl.col(ColName.PICK_NUMBER) + 1,
168
168
  ),
169
+ ColName.PICK_INDEX: ColSpec(
170
+ col_type=ColType.GROUP_BY,
171
+ expr=lambda set_context: pl.col(ColName.PICK_NUMBER) + pl.col(ColName.PACK_NUMBER) * set_context['picks_per_pack']
172
+ ),
169
173
  ColName.TAKEN_AT: ColSpec(
170
174
  col_type=ColType.PICK_SUM,
171
175
  expr=pl.col(ColName.PICK_NUM),
spells/enums.py CHANGED
@@ -60,6 +60,7 @@ class ColName(StrEnum):
60
60
  PACK_NUM = "pack_num" # pack_number plus 1
61
61
  PICK_NUMBER = "pick_number"
62
62
  PICK_NUM = "pick_num" # pick_number plus 1
63
+ PICK_INDEX = "pick_index" # 0 - 3 * picks_per_pack - 1
63
64
  TAKEN_AT = "taken_at"
64
65
  NUM_TAKEN = "num_taken"
65
66
  NUM_DRAFTS = "num_drafts"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spells-mtg
3
- Version: 0.10.7
3
+ Version: 0.10.9
4
4
  Summary: analaysis of 17Lands.com public datasets
5
5
  Author-Email: Joel Barnes <oelarnes@gmail.com>
6
6
  License: MIT
@@ -412,6 +412,7 @@ A table of all included columns. Columns can be referenced by enum or by string
412
412
  | `PACK_NUM` | `"pack_num"` | `DRAFT` | `GROUP_BY` | 1-indexed | Int |
413
413
  | `PICK_NUMBER` | `"pick_number"` | `DRAFT` | `FILTER_ONLY` | Dataset Column | Int |
414
414
  | `PICK_NUM` | `"pick_num"` | `DRAFT` | `GROUP_BY` | 1-indexed | Int |
415
+ | `PICK_INDEX` | `"pick_index"` | `DRAFT` | `GROUP_BY` | 0-indexed, through 39/42/45 depending on set | Int |
415
416
  | `TAKEN_AT` | `"taken_at` | `DRAFT` | `PICK_SUM` | Summable alias of `PICK_NUM` | Int |
416
417
  | `NUM_DRAFTS` | `"num_drafts"` | `DRAFT` | `PICK_SUM` | | Int |
417
418
  | `NUM_TAKEN` | `"num_taken"` | `DRAFT` | `PICK_SUM` | Sum 1 over rows | Int |
@@ -1,10 +1,10 @@
1
1
  spells/__init__.py,sha256=0pnh2NLn9FrNKncE9-tBsighp3e8YAsN--_ovUpgWGs,333
2
- spells/cache.py,sha256=7XDcltmlpagK2nkhuCCcAQVyrFMYkw9Acr7iVsLs3JU,3799
2
+ spells/cache.py,sha256=5eaxaahfppCOFVEukiPyzGhsE-qv4NPx4Lbu2R-T4pg,5696
3
3
  spells/cards.py,sha256=6stFPhJOzHqvQnkSv9cDeylRa_7L9Y8sOaowiZhzz6I,4174
4
- spells/columns.py,sha256=sxYPli2CjjOtPmVz38OqpO-2YYhwuGGLH3s01X9DU8Y,18008
4
+ spells/columns.py,sha256=s_PYyg2QaRL6kLWFNKCBEfbMF0x7O7-Yd9SeG1ttYL4,18206
5
5
  spells/config.py,sha256=ixAe_raxKYvJBXyvNBJ-mm6ziRiAvtKLJihyFMnashs,224
6
6
  spells/draft_data.py,sha256=xoL82NTgTJWxZK1p-6LjxnYzkeYOr-Dc9-_T0m-WZ1Y,19946
7
- spells/enums.py,sha256=MwJ9694AVoaKE22WlFjzHPcRfrU0DKI2_mrWC6_YjhE,4931
7
+ spells/enums.py,sha256=gbwfon6tQCoKDb-m4hSaHWi9slj82yqaH3qhYMVrsck,4991
8
8
  spells/extension.py,sha256=LBqGbJbe7iSRQkxJK7npkADCfzhdnIwwVvlmTn8xvjQ,8454
9
9
  spells/external.py,sha256=USqOtOVY7Mn39rdUPhmIeGm08s6TDnEV8-N3D14qJzE,11844
10
10
  spells/filter.py,sha256=J-YTOOAzOQpvIX29tviYL04RVoOUlfsbjBXoQBDCEdQ,3380
@@ -12,8 +12,8 @@ spells/log.py,sha256=3avmg65hru8K9npKLvPp1wWWxq-hoEYDUCbxqhPkKUw,2175
12
12
  spells/manifest.py,sha256=iOmhxIVMHu_Av3nd23zGjmUwLvZ2hAM0oc1ErPzZ_oE,8341
13
13
  spells/schema.py,sha256=DbMvV8PIThJTp0Xzp_XIorlW6JhE1ud1kWRGf5SQ4_c,6406
14
14
  spells/utils.py,sha256=IO3brrXVvZla0LRTEB5v6NgGqZb_rYA46XtKBURGMNk,1944
15
- spells_mtg-0.10.7.dist-info/METADATA,sha256=XFOEQSyt-ddYxzPcspB5_kaeJj8XE-WPMylV-flVIvM,47227
16
- spells_mtg-0.10.7.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
17
- spells_mtg-0.10.7.dist-info/entry_points.txt,sha256=a9Y1omdl9MdnKuIj3aOodgrp-zZII6OCdvqwgP6BFvI,63
18
- spells_mtg-0.10.7.dist-info/licenses/LICENSE,sha256=tS54XYbJSgmq5zuHhbsQGbNQLJPVgXqhF5nu2CSRMig,1068
19
- spells_mtg-0.10.7.dist-info/RECORD,,
15
+ spells_mtg-0.10.9.dist-info/METADATA,sha256=fTYoWwgKSx9VeSvsd08q7r-Q_KvCn-xcz2tPEHv6Wwo,47369
16
+ spells_mtg-0.10.9.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
17
+ spells_mtg-0.10.9.dist-info/entry_points.txt,sha256=a9Y1omdl9MdnKuIj3aOodgrp-zZII6OCdvqwgP6BFvI,63
18
+ spells_mtg-0.10.9.dist-info/licenses/LICENSE,sha256=tS54XYbJSgmq5zuHhbsQGbNQLJPVgXqhF5nu2CSRMig,1068
19
+ spells_mtg-0.10.9.dist-info/RECORD,,