diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/pyproject.toml b/pyproject.toml
index 8e3432c..9463533 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,20 +1,36 @@
+[build-system]
+requires = ["setuptools>=42.0", "wheel"]
+build-backend = "setuptools.build_meta"
+
[project]
name = "tetris"
version = "0.1.0"
-description = "Tetris game with AI"
+description = "Tetris game"
authors = [{ name = "Kristofers Solo", email = "dev@kristofers.xyz" }]
readme = "README.md"
requires-python = ">=3.11"
-license = { text = "GPLv3" }
+license = { file = "LICENSE" }
dependencies = [
"attrs==23.1.0",
"loguru==0.7.2",
- "neat-python==0.92",
"numpy==1.26.3",
"pygame-ce==2.4.0",
+ "toml==0.10.2",
+]
+keywords = ["tetris", "game", "pygame"]
+classifiers = [
+ "Development Status :: 3 - Alpha",
+ "License :: OSI Approved :: GPLv3 License",
+ "Programming Language :: Python :: 3 :: Only",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
]
+[project.urls]
+Repository = "https://github.com/kristoferssolo/Tetris"
+
[tool.mypy]
+mypy_path = "src"
check_untyped_defs = true
disallow_any_generics = true
ignore_missing_imports = true
@@ -32,7 +48,8 @@ line-length = 120
indent-width = 4
[tool.ruff.lint]
-select = ["I"]
+extend-select = ["I"]
+preview = true
[tool.ruff.format]
quote-style = "double"
diff --git a/requirements.txt b/requirements.txt
index 56c1f94..e8c8681 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,6 @@
-attrs>=23.1.0
-loguru>=0.7.2
-neat-python>=0.92
-numpy>=1.26.3
-pygame-ce>=2.4.0
+attrs==23.1.0
+loguru==0.7.2
+numpy==1.26.3
+pygame-ce==2.4.0
+toml==0.10.2
.
diff --git a/requirements_dev.txt b/requirements_dev.txt
index 5dcd987..f3bc67b 100644
--- a/requirements_dev.txt
+++ b/requirements_dev.txt
@@ -1,3 +1,3 @@
-mypy>=1.8.0
-pytest>=7.4.3
-ruff>=0.1.9
+mypy==1.8.0
+pytest==7.4.3
+ruff==0.1.9
diff --git a/tetris/__init__.py b/tetris/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tetris/__main__.py b/tetris/__main__.py
new file mode 100644
index 0000000..a47c87b
--- /dev/null
+++ b/tetris/__main__.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+import argparse
+import sys
+
+from loguru import logger
+
+parser = argparse.ArgumentParser(description="Tetris game with AI")
+group = parser.add_mutually_exclusive_group()
+group.add_argument(
+ "-d",
+ "--debug",
+ action="store_true",
+ help="Debug",
+)
+
+group.add_argument(
+ "-v",
+ "--verbose",
+ action="store_true",
+ help="Verbose",
+)
+
+parser.add_argument(
+ "-g",
+ "--graphic",
+ action="store_true",
+ help="Run app with GUI [Default]",
+)
+
+
+def setup_logger(level: str = "warning") -> None:
+ from utils import BASE_PATH
+
+ logger.remove()
+ logger.add(
+ sink=sys.stdout,
+ format="{time} | {level} | {message}",
+ level=level.upper(),
+ colorize=True,
+ )
+
+ logger.add(
+ BASE_PATH / ".logs" / "teris.log",
+ format="{time} | {level} | {message}",
+ level="DEBUG" if level.upper() == "DEBUG" else "INFO",
+ rotation="10 MB",
+ compression="zip",
+ )
+
+
+@logger.catch
+def run() -> None:
+ import game
+ from utils import GameMode
+
+ logger.debug("Launching the game")
+ game.Main(GameMode.PLAYER).run()
+
+
+def main(args: argparse.ArgumentParser) -> None:
+ if args.debug:
+ level = "debug"
+ elif args.verbose:
+ level = "info"
+ else:
+ level = "warning"
+
+ setup_logger(level)
+
+ run()
+
+
+if __name__ == "__main__":
+ args = parser.parse_args()
+ main(args)