mirror of
https://github.com/onyx-and-iris/lottery-tui.git
synced 2026-07-29 09:24:24 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 97e5c9df5a | |||
| 1efd518e9f | |||
| a8a46f718d | |||
| 5eaa521b8d | |||
| 19b4f32c5a | |||
| 1bd6c0e94f | |||
| cfba2303e6 | |||
| a2ab27fa5b |
12
.pre-commit-config.yaml
Normal file
12
.pre-commit-config.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: check-yaml
|
||||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
|
||||
- repo: https://github.com/pdm-project/pdm
|
||||
rev: 2.26.6
|
||||
hooks:
|
||||
- id: pdm-lock-check
|
||||
@@ -34,7 +34,7 @@ The TUI should now be discoverable as lottery-tui.
|
||||
|
||||
Launch the TUI, select a lottery and press the Draw button!
|
||||
|
||||
To exit from the application press *q* or *Ctrl+q*
|
||||
To exit from the application press `Ctrl+q`.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "lottery-tui"
|
||||
version = "0.2.8"
|
||||
version = "1.1.0"
|
||||
description = "A terminal user interface for lottery games."
|
||||
authors = [{ name = "onyx-and-iris", email = "code@onyxandiris.online" }]
|
||||
dependencies = ["textual>=8.0.0", "loguru>=0.7.3"]
|
||||
@@ -8,7 +8,7 @@ requires-python = ">=3.10"
|
||||
readme = "README.md"
|
||||
license = { text = "MIT" }
|
||||
classifiers = [
|
||||
"Development Status :: 4 - Beta",
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Programming Language :: Python",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
|
||||
@@ -33,6 +33,8 @@ class Result:
|
||||
bonus_name = 'Life Ball'
|
||||
case 'Thunderball':
|
||||
bonus_name = 'Thunderball'
|
||||
case 'Powerball':
|
||||
bonus_name = 'Powerball'
|
||||
case _:
|
||||
bonus_name = 'Bonus Numbers'
|
||||
out += f'\n{bonus_name}: {", ".join(str(n) for n in self.bonus)}'
|
||||
@@ -94,11 +96,11 @@ class EuroMillions(Lottery):
|
||||
class SetForLife(Lottery):
|
||||
"""A class representing the Set For Life lottery.
|
||||
|
||||
Set For Life draws 5 numbers from a pool of 1 to 39, without replacement,
|
||||
Set For Life draws 5 numbers from a pool of 1 to 47, without replacement,
|
||||
and 1 "Life Ball" number from a separate pool of 1 to 10.
|
||||
"""
|
||||
|
||||
POSSIBLE_NUMBERS = range(1, 40)
|
||||
POSSIBLE_NUMBERS = range(1, 48)
|
||||
|
||||
def draw(self) -> Result:
|
||||
"""Perform a Set For Life draw."""
|
||||
@@ -124,6 +126,23 @@ class Thunderball(Lottery):
|
||||
return Result(kind=type(self).__name__, numbers=numbers, bonus=thunderball)
|
||||
|
||||
|
||||
@register_lottery
|
||||
class Powerball(Lottery):
|
||||
"""A class representing the Powerball lottery.
|
||||
|
||||
Powerball draws 5 numbers from a pool of 1 to 69, without replacement,
|
||||
and 1 "Powerball" number from a separate pool of 1 to 26.
|
||||
"""
|
||||
|
||||
POSSIBLE_NUMBERS = range(1, 70)
|
||||
|
||||
def draw(self) -> Result:
|
||||
"""Perform a Powerball draw."""
|
||||
numbers = random.sample(Powerball.POSSIBLE_NUMBERS, 5)
|
||||
powerball = [random.randint(1, 26)]
|
||||
return Result(kind=type(self).__name__, numbers=numbers, bonus=powerball)
|
||||
|
||||
|
||||
def request_lottery_obj(lottery_name: str) -> Lottery:
|
||||
"""Return a lottery object based on the provided lottery name."""
|
||||
lottery_cls = registry.get(lottery_name.lower())
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from typing import NoReturn
|
||||
|
||||
from rich.text import Text
|
||||
from textual.app import App, ComposeResult
|
||||
from textual.containers import Container
|
||||
from textual.events import Key
|
||||
@@ -26,7 +25,11 @@ class LotteryTUI(App):
|
||||
('EuroMillions', 'euromillions'),
|
||||
('Set For Life', 'setforlife'),
|
||||
('Thunderball', 'thunderball'),
|
||||
('Powerball', 'powerball'),
|
||||
],
|
||||
value='lotto',
|
||||
allow_blank=False,
|
||||
type_to_search=True,
|
||||
id='lottery-select',
|
||||
),
|
||||
Button('Draw', id='draw-button'),
|
||||
@@ -46,22 +49,13 @@ class LotteryTUI(App):
|
||||
|
||||
def _draw_button_handler(self) -> None:
|
||||
"""Handle the draw button press."""
|
||||
if self._read_lottery_selection() is None:
|
||||
self._update_result_label(
|
||||
Text('Please select a lottery before drawing.', style='bold #ff8c42')
|
||||
)
|
||||
return
|
||||
|
||||
lottery_obj = request_lottery_obj(self._read_lottery_selection())
|
||||
result = lottery_obj.draw()
|
||||
self._update_result_label(str(result))
|
||||
|
||||
def _read_lottery_selection(self) -> SelectType | None:
|
||||
def _read_lottery_selection(self) -> SelectType:
|
||||
"""Read the selected lottery from the dropdown."""
|
||||
select_widget = self.query_one('#lottery-select')
|
||||
if select_widget.is_blank():
|
||||
return None
|
||||
return select_widget.value
|
||||
return self.query_one('#lottery-select').value
|
||||
|
||||
def _update_result_label(self, message: str) -> None:
|
||||
"""Update the result label with a new message."""
|
||||
|
||||
Reference in New Issue
Block a user