diff --git a/python-pyproject-toml/README.md b/python-pyproject-toml/README.md new file mode 100644 index 0000000000..0428090f46 --- /dev/null +++ b/python-pyproject-toml/README.md @@ -0,0 +1,3 @@ +# Python pyproject.toml Project Example + +Here are supporting materials for the Real Python tutorial [How to Manage Python Projects With `pyproject.toml`](https://realpython.com/python-pyproject-toml/). diff --git a/python-pyproject-toml/snakesay-project/.gitignore b/python-pyproject-toml/snakesay-project/.gitignore new file mode 100644 index 0000000000..294badfbb9 --- /dev/null +++ b/python-pyproject-toml/snakesay-project/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +*.pyc +*.pyo +*.egg-info +venv/ \ No newline at end of file diff --git a/python-pyproject-toml/snakesay-project/LICENSE b/python-pyproject-toml/snakesay-project/LICENSE new file mode 100644 index 0000000000..6c86d5ae59 --- /dev/null +++ b/python-pyproject-toml/snakesay-project/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024 Real Python + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/python-pyproject-toml/snakesay-project/README.md b/python-pyproject-toml/snakesay-project/README.md new file mode 100644 index 0000000000..8f47e7ee17 --- /dev/null +++ b/python-pyproject-toml/snakesay-project/README.md @@ -0,0 +1,19 @@ +# Snakesay + +A simple Python project that prints a message in a speech bubble inspired by the classic [`cowsay`](https://en.wikipedia.org/wiki/Cowsay) program. Originally created by [Ian Currie](https://realpython.com/team/icurrie/) and [Geir Arne Hjelle](https://realpython.com/team/gahjelle/) for the [Everyday Project Packaging With `pyproject.toml`](https://realpython.com/courses/packaging-with-pyproject-toml/) course on Real Python. + +```console +$ ssay Hello World! + + ______________ +( Hello World! ) + ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + \ + \ ___ + \ (o o) + \_/ \ + λ \ \ + _\ \_ + (_____)_ + (________)=Oo° +``` diff --git a/python-pyproject-toml/snakesay-project/pyproject.toml b/python-pyproject-toml/snakesay-project/pyproject.toml new file mode 100644 index 0000000000..ef367d3f28 --- /dev/null +++ b/python-pyproject-toml/snakesay-project/pyproject.toml @@ -0,0 +1,45 @@ +[build-system] +requires = ["setuptools>=75.3.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "snakesay" +dependencies = ["rich>=13.9.0"] +authors = [{name = "Jin Doe", email = "jindoe@example.com"}] +keywords = ["CLI", "ASCII Art"] +readme = {file = "README.md", content-type = "text/markdown"} +requires-python = ">=3.9" +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dynamic = ["version"] + +[project.urls] +Repository = "https://github.com/me/spam.git" +Issues = "https://github.com/me/spam/issues" + +[project.optional-dependencies] +dev = ["black>=24.1.0", "isort>=5.13.0", "build", "twine"] + +[project.scripts] +ssay = "snakesay.__main__:main" + +[tool.setuptools.packages.find] +where = ["."] + +[tool.setuptools.dynamic] +version = {attr = "snakesay.__version__"} + +[tool.black] +line-length = 88 + +[tool.isort] +profile = "black" \ No newline at end of file diff --git a/python-pyproject-toml/snakesay-project/snakesay/__init__.py b/python-pyproject-toml/snakesay-project/snakesay/__init__.py new file mode 100644 index 0000000000..4387b5b076 --- /dev/null +++ b/python-pyproject-toml/snakesay-project/snakesay/__init__.py @@ -0,0 +1,3 @@ +"""Snakesay - cowsay, but with a snake.""" + +__version__ = "0.1.0" diff --git a/python-pyproject-toml/snakesay-project/snakesay/__main__.py b/python-pyproject-toml/snakesay-project/snakesay/__main__.py new file mode 100644 index 0000000000..70f142dbad --- /dev/null +++ b/python-pyproject-toml/snakesay-project/snakesay/__main__.py @@ -0,0 +1,11 @@ +import sys + +from snakesay import snake + + +def main(): + snake.say(" ".join(sys.argv[1:])) + + +if __name__ == "__main__": + main() diff --git a/python-pyproject-toml/snakesay-project/snakesay/snake.py b/python-pyproject-toml/snakesay-project/snakesay/snake.py new file mode 100644 index 0000000000..4ca60c44a9 --- /dev/null +++ b/python-pyproject-toml/snakesay-project/snakesay/snake.py @@ -0,0 +1,22 @@ +SNAKE = r""" \ + \ ___ + \ (o o) + \_/ \ + λ \ \ + _\ \_ + (_____)_ + (________)=Oo° +""" + + +def bubble(message): + bubble_length = len(message) + 2 + return f""" + {"_" * bubble_length} +( {message} ) + {"‾" * bubble_length}""" + + +def say(message): + print(bubble(message.replace("s", "ss").replace("S", "SS"))) + print(SNAKE)