4 Commits

Author SHA1 Message Date
039487cfc5 sort the numbers before printing them
upd screenshot to reflect sorted results

patch bump
2026-02-21 22:08:45 +00:00
84fcbd326a add annotations 2026-02-21 22:03:52 +00:00
47ced52722 check for empty selection and return early if blank.
this fixes a crash should a draw be attempted without a selection.
2026-02-21 21:56:05 +00:00
9405b4a588 fix the build
minor bump
2026-02-21 21:41:34 +00:00
4 changed files with 23 additions and 9 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "lottery-tui" name = "lottery-tui"
version = "0.1.1" version = "0.2.2"
description = "A terminal user interface for lottery games." description = "A terminal user interface for lottery games."
authors = [{ name = "onyx-and-iris", email = "code@onyxandiris.online" }] authors = [{ name = "onyx-and-iris", email = "code@onyxandiris.online" }]
dependencies = ["textual>=8.0.0"] dependencies = ["textual>=8.0.0"]
@@ -11,5 +11,13 @@ license = { text = "MIT" }
[project.scripts] [project.scripts]
lottery-tui = "lottery_tui.tui:main" lottery-tui = "lottery_tui.tui:main"
[build-system]
requires = ["pdm-backend"]
build-backend = "pdm.backend"
[tool.pdm] [tool.pdm]
distribution = true distribution = true
[tool.pdm.build]
package-dir = "src"
includes = ["src/**/*", "README.md", "LICENSE"]

View File

@@ -12,7 +12,7 @@ class Result(NamedTuple):
def __str__(self) -> str: def __str__(self) -> str:
"""Return a string representation of the lottery result.""" """Return a string representation of the lottery result."""
out = f'Numbers: {", ".join(str(n) for n in self.numbers)}' out = f'Numbers: {", ".join(str(n) for n in sorted(self.numbers))}'
if self.bonus: if self.bonus:
match self.kind: match self.kind:
case 'EuroMillions': case 'EuroMillions':
@@ -23,7 +23,7 @@ class Result(NamedTuple):
bonus_name = 'Thunderball' bonus_name = 'Thunderball'
case _: case _:
bonus_name = 'Bonus Numbers' bonus_name = 'Bonus Numbers'
out += f'\n{bonus_name}: {", ".join(str(n) for n in self.bonus)}' out += f'\n{bonus_name}: {", ".join(str(n) for n in sorted(self.bonus))}'
return out return out
@@ -40,7 +40,7 @@ class Lottery(ABC):
"""An abstract base class for different types of lotteries.""" """An abstract base class for different types of lotteries."""
@abstractmethod @abstractmethod
def draw(self): def draw(self) -> Result:
"""Perform a lottery draw.""" """Perform a lottery draw."""
@@ -54,7 +54,7 @@ class UKlotto(Lottery):
POSSIBLE_NUMBERS = range(1, 60) POSSIBLE_NUMBERS = range(1, 60)
def draw(self): def draw(self) -> Result:
"""Perform a UK Lotto draw.""" """Perform a UK Lotto draw."""
result = random.sample(UKlotto.POSSIBLE_NUMBERS, 6) result = random.sample(UKlotto.POSSIBLE_NUMBERS, 6)
return Result(kind='UK Lotto', numbers=result, bonus=None) return Result(kind='UK Lotto', numbers=result, bonus=None)
@@ -71,7 +71,7 @@ class EuroMillions(Lottery):
POSSIBLE_NUMBERS = range(1, 51) POSSIBLE_NUMBERS = range(1, 51)
POSSIBLE_BONUS_NUMBERS = range(1, 13) POSSIBLE_BONUS_NUMBERS = range(1, 13)
def draw(self): def draw(self) -> Result:
"""Perform a EuroMillions draw.""" """Perform a EuroMillions draw."""
numbers = random.sample(EuroMillions.POSSIBLE_NUMBERS, 5) numbers = random.sample(EuroMillions.POSSIBLE_NUMBERS, 5)
bonus = random.sample(EuroMillions.POSSIBLE_BONUS_NUMBERS, 2) bonus = random.sample(EuroMillions.POSSIBLE_BONUS_NUMBERS, 2)
@@ -88,7 +88,7 @@ class SetForLife(Lottery):
POSSIBLE_NUMBERS = range(1, 40) POSSIBLE_NUMBERS = range(1, 40)
def draw(self): def draw(self) -> Result:
"""Perform a Set For Life draw.""" """Perform a Set For Life draw."""
numbers = random.sample(SetForLife.POSSIBLE_NUMBERS, 5) numbers = random.sample(SetForLife.POSSIBLE_NUMBERS, 5)
life_ball = [random.randint(1, 10)] life_ball = [random.randint(1, 10)]
@@ -105,7 +105,7 @@ class Thunderball(Lottery):
POSSIBLE_NUMBERS = range(1, 40) # Thunderball numbers range from 1 to 39 POSSIBLE_NUMBERS = range(1, 40) # Thunderball numbers range from 1 to 39
def draw(self): def draw(self) -> Result:
"""Perform a Thunderball draw.""" """Perform a Thunderball draw."""
numbers = random.sample(Thunderball.POSSIBLE_NUMBERS, 5) numbers = random.sample(Thunderball.POSSIBLE_NUMBERS, 5)
thunderball = [random.randint(1, 14)] thunderball = [random.randint(1, 14)]

View File

@@ -37,11 +37,17 @@ class LotteryTUI(App):
def on_button_pressed(self, event): def on_button_pressed(self, event):
"""Handle button press events.""" """Handle button press events."""
if event.button.id == 'draw-button': if event.button.id == 'draw-button':
if self.query_one('#lottery-select').is_blank():
self.query_one('#result-label').update(
'Please select a lottery before drawing.'
)
return
selected_lottery = self.query_one('#lottery-select').value selected_lottery = self.query_one('#lottery-select').value
try: try:
lottery_obj = request_lottery_obj(selected_lottery) lottery_obj = request_lottery_obj(selected_lottery)
result = lottery_obj.draw() result = lottery_obj.draw()
self.query_one('#result-label').update(f'Result: {result}')
except ValueError as e: except ValueError as e:
self.query_one('#result-label').update(str(e)) self.query_one('#result-label').update(str(e))