mirror of
https://github.com/mwisnowski/mtg_python_deckbuilder.git
synced 2025-12-16 15:40:12 +01:00
fix(lint): improved type checking and code quality (77% error reduction)
This commit is contained in:
parent
3c45a31aa3
commit
83fe527979
37 changed files with 423 additions and 303 deletions
|
|
@ -19,7 +19,7 @@ Host DeckBuilder must supply:
|
|||
"""
|
||||
|
||||
class LandFetchMixin:
|
||||
def add_fetch_lands(self, requested_count: int | None = None): # type: ignore[override]
|
||||
def add_fetch_lands(self, requested_count: int | None = None):
|
||||
"""Add fetch lands (color-specific + generic) respecting land target."""
|
||||
if not getattr(self, 'files_to_load', []):
|
||||
try:
|
||||
|
|
@ -28,8 +28,8 @@ class LandFetchMixin:
|
|||
except Exception as e: # pragma: no cover - defensive
|
||||
self.output_func(f"Cannot add fetch lands until color identity resolved: {e}")
|
||||
return
|
||||
land_target = (getattr(self, 'ideal_counts', {}).get('lands') if getattr(self, 'ideal_counts', None) else None) or getattr(bc, 'DEFAULT_LAND_COUNT', 35) # type: ignore[attr-defined]
|
||||
current = self._current_land_count() # type: ignore[attr-defined]
|
||||
land_target = (getattr(self, 'ideal_counts', {}).get('lands') if getattr(self, 'ideal_counts', None) else None) or getattr(bc, 'DEFAULT_LAND_COUNT', 35)
|
||||
current = self._current_land_count()
|
||||
color_order = [c for c in getattr(self, 'color_identity', []) if c in ['W','U','B','R','G']]
|
||||
color_map = getattr(bc, 'COLOR_TO_FETCH_LANDS', {})
|
||||
candidates: List[str] = []
|
||||
|
|
@ -56,7 +56,7 @@ class LandFetchMixin:
|
|||
self.output_func("\nAdd Fetch Lands (Step 4):")
|
||||
self.output_func("Fetch lands help fix colors & enable landfall / graveyard synergies.")
|
||||
prompt = f"Enter desired number of fetch lands (default: {effective_default}):"
|
||||
desired = self._prompt_int_with_default(prompt + ' ', effective_default, minimum=0, maximum=20) # type: ignore[attr-defined]
|
||||
desired = self._prompt_int_with_default(prompt + ' ', effective_default, minimum=0, maximum=20)
|
||||
else:
|
||||
desired = max(0, int(requested_count))
|
||||
if desired > remaining_fetch_slots:
|
||||
|
|
@ -70,20 +70,20 @@ class LandFetchMixin:
|
|||
if remaining_capacity == 0 and desired > 0:
|
||||
min_basic_cfg = getattr(bc, 'DEFAULT_BASIC_LAND_COUNT', 20)
|
||||
if getattr(self, 'ideal_counts', None):
|
||||
min_basic_cfg = self.ideal_counts.get('basic_lands', min_basic_cfg) # type: ignore[attr-defined]
|
||||
floor_basics = self._basic_floor(min_basic_cfg) # type: ignore[attr-defined]
|
||||
min_basic_cfg = self.ideal_counts.get('basic_lands', min_basic_cfg)
|
||||
floor_basics = self._basic_floor(min_basic_cfg)
|
||||
slots_needed = desired
|
||||
while slots_needed > 0 and self._count_basic_lands() > floor_basics: # type: ignore[attr-defined]
|
||||
target_basic = self._choose_basic_to_trim() # type: ignore[attr-defined]
|
||||
if not target_basic or not self._decrement_card(target_basic): # type: ignore[attr-defined]
|
||||
while slots_needed > 0 and self._count_basic_lands() > floor_basics:
|
||||
target_basic = self._choose_basic_to_trim()
|
||||
if not target_basic or not self._decrement_card(target_basic):
|
||||
break
|
||||
slots_needed -= 1
|
||||
remaining_capacity = max(0, land_target - self._current_land_count()) # type: ignore[attr-defined]
|
||||
remaining_capacity = max(0, land_target - self._current_land_count())
|
||||
if remaining_capacity > 0 and slots_needed == 0:
|
||||
break
|
||||
if slots_needed > 0 and remaining_capacity == 0:
|
||||
desired -= slots_needed
|
||||
remaining_capacity = max(0, land_target - self._current_land_count()) # type: ignore[attr-defined]
|
||||
remaining_capacity = max(0, land_target - self._current_land_count())
|
||||
desired = min(desired, remaining_capacity, len(candidates), remaining_fetch_slots)
|
||||
if desired <= 0:
|
||||
self.output_func("Fetch Lands: No capacity (after trimming) or desired reduced to 0; skipping.")
|
||||
|
|
@ -101,7 +101,7 @@ class LandFetchMixin:
|
|||
if k >= len(pool):
|
||||
return pool.copy()
|
||||
try:
|
||||
return (rng.sample if rng else random.sample)(pool, k) # type: ignore
|
||||
return (rng.sample if rng else random.sample)(pool, k)
|
||||
except Exception:
|
||||
return pool[:k]
|
||||
need = desired
|
||||
|
|
@ -117,7 +117,7 @@ class LandFetchMixin:
|
|||
|
||||
added: List[str] = []
|
||||
for nm in chosen:
|
||||
if self._current_land_count() >= land_target: # type: ignore[attr-defined]
|
||||
if self._current_land_count() >= land_target:
|
||||
break
|
||||
note = 'generic' if nm in generic_list else 'color-specific'
|
||||
self.add_card(
|
||||
|
|
@ -126,11 +126,11 @@ class LandFetchMixin:
|
|||
role='fetch',
|
||||
sub_role=note,
|
||||
added_by='lands_step4'
|
||||
) # type: ignore[attr-defined]
|
||||
)
|
||||
added.append(nm)
|
||||
# Record actual number of fetch lands added for export/replay context
|
||||
try:
|
||||
setattr(self, 'fetch_count', len(added)) # type: ignore[attr-defined]
|
||||
setattr(self, 'fetch_count', len(added))
|
||||
except Exception:
|
||||
pass
|
||||
self.output_func("\nFetch Lands Added (Step 4):")
|
||||
|
|
@ -141,9 +141,9 @@ class LandFetchMixin:
|
|||
for n in added:
|
||||
note = 'generic' if n in generic_list else 'color-specific'
|
||||
self.output_func(f" {n.ljust(width)} : 1 ({note})")
|
||||
self.output_func(f" Land Count Now : {self._current_land_count()} / {land_target}") # type: ignore[attr-defined]
|
||||
self.output_func(f" Land Count Now : {self._current_land_count()} / {land_target}")
|
||||
|
||||
def run_land_step4(self, requested_count: int | None = None): # type: ignore[override]
|
||||
def run_land_step4(self, requested_count: int | None = None):
|
||||
"""Public wrapper to add fetch lands.
|
||||
|
||||
If ideal_counts['fetch_lands'] is set, it will be used to bypass the prompt in both CLI and web builds.
|
||||
|
|
@ -155,7 +155,7 @@ class LandFetchMixin:
|
|||
except Exception:
|
||||
desired = requested_count
|
||||
self.add_fetch_lands(requested_count=desired)
|
||||
self._enforce_land_cap(step_label="Fetch (Step 4)") # type: ignore[attr-defined]
|
||||
self._enforce_land_cap(step_label="Fetch (Step 4)")
|
||||
try:
|
||||
from .. import builder_utils as _bu
|
||||
_bu.export_current_land_pool(self, '4')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue