Milestone 001: Project Foundation #30
+100
@@ -0,0 +1,100 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
cover/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Documentation builds (Doxygen writes to build/doxygen, see Doxyfile)
|
||||||
|
docs/_build/
|
||||||
|
doxygen_warnings.log
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.envrc
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Type checkers and linters
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
.pyre/
|
||||||
|
.pytype/
|
||||||
|
.ruff_cache/
|
||||||
|
|
||||||
|
# IDEs and editors
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# Operating system files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
desktop.ini
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=77"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "turtle-challenges"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Turtle graphics exercises from Udemy's 100 Days of Code Python bootcamp (day 18)."
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.13"
|
||||||
|
license = "AGPL-3.0-only"
|
||||||
|
license-files = ["LICENSE"]
|
||||||
|
# Only the standard library is used at run time (turtle needs Tk, see README).
|
||||||
|
dependencies = []
|
||||||
|
classifiers = [
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"Programming Language :: Python :: 3.13",
|
||||||
|
"Topic :: Education",
|
||||||
|
]
|
||||||
|
|
||||||
|
[project.optional-dependencies]
|
||||||
|
dev = [
|
||||||
|
"mypy>=1.13",
|
||||||
|
"pytest>=8.3",
|
||||||
|
"ruff>=0.8",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.setuptools.packages.find]
|
||||||
|
where = ["src"]
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
pythonpath = ["src", "."]
|
||||||
|
testpaths = ["tests"]
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
line-length = 88
|
||||||
|
target-version = "py313"
|
||||||
|
src = ["src", "tests"]
|
||||||
|
# Only the project's own code: the framework submodule and agent skills are not ours.
|
||||||
|
include = ["src/**/*.py", "tests/**/*.py"]
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
select = ["ANN", "B", "E", "F", "I", "N", "SIM", "UP", "W"]
|
||||||
|
|
||||||
|
[tool.mypy]
|
||||||
|
strict = true
|
||||||
|
files = ["src", "tests"]
|
||||||
|
mypy_path = "src"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
"""!
|
||||||
|
@file __init__.py
|
||||||
|
@brief Solutions to the turtle graphics challenges of day 18 of Udemy's
|
||||||
|
100 Days of Code.
|
||||||
|
|
||||||
|
The challenges are added one milestone at a time; see the README.
|
||||||
|
"""
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
"""!
|
||||||
|
@file constants.py
|
||||||
|
@brief Every constant of the project, in one place.
|
||||||
|
|
||||||
|
Numbers and names used by the challenges live here and nowhere else, so a
|
||||||
|
challenge can be tuned (for example the number of dashes) without touching its
|
||||||
|
drawing code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
## Title of the turtle window.
|
||||||
|
WINDOW_TITLE = "Turtle Challenges"
|
||||||
|
|
||||||
|
## Largest value of one color channel; also the turtle color mode, so that
|
||||||
|
## colors can be given as RGB tuples from 0 to 255.
|
||||||
|
COLOR_MODE = 255
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import turtle_challenges
|
||||||
|
from turtle_challenges import constants
|
||||||
|
|
||||||
|
|
||||||
|
def test_package_can_be_imported_and_is_documented() -> None:
|
||||||
|
assert turtle_challenges.__doc__
|
||||||
|
|
||||||
|
|
||||||
|
def test_color_mode_is_the_rgb_range_of_the_course() -> None:
|
||||||
|
assert constants.COLOR_MODE == 255
|
||||||
|
|
||||||
|
|
||||||
|
def test_window_title_is_not_empty() -> None:
|
||||||
|
assert constants.WINDOW_TITLE
|
||||||
Reference in New Issue
Block a user