diff --git a/README.md b/README.md new file mode 100644 index 0000000..2cc18fd --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Groove On Demand + +WIP. See https://linernotes.club/@evilchili/109372059926262668 diff --git a/env.dist b/env.dist new file mode 100644 index 0000000..7ff0da3 --- /dev/null +++ b/env.dist @@ -0,0 +1,3 @@ +HOST=127.0.0.1 +PORT==2323 +DEBUG= diff --git a/groove/__init__.py b/groove/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/groove/cli.py b/groove/cli.py new file mode 100644 index 0000000..d472711 --- /dev/null +++ b/groove/cli.py @@ -0,0 +1,46 @@ +import logging +import os +import typer + +from dotenv import load_dotenv +from groove import ondemand + + +app = typer.Typer() + + +@app.command() +def server( + host: str = typer.Argument( + '0.0.0.0', + help="bind address", + ), + port: int = typer.Argument( + 2323, + help="bind port", + ), + debug: bool = typer.Option( + False, + help='Enable debugging output' + ), +): + """ + Start the Groove on Demand playlsit server. + """ + load_dotenv() + + print("Starting Groove On Demand...") + + debug = os.getenv('DEBUG', None) + logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.DEBUG if debug else logging.INFO) + ondemand.server.run( + host=os.getenv('HOST', host), + port=os.getenv('PORT', port), + debug=debug, + server='paste', + quiet=True + ) + + +if __name__ == '__main__': + app() diff --git a/groove/ondemand.py b/groove/ondemand.py new file mode 100644 index 0000000..ce2d1f1 --- /dev/null +++ b/groove/ondemand.py @@ -0,0 +1,8 @@ +from bottle import Bottle + +server = Bottle() + + +@server.route('/') +def index(): + return "Groovy." diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..8d2bee6 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,221 @@ +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "boddle" +version = "0.2.9" +description = "A unit testing tool for Python's bottle library." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +bottle = "*" + +[[package]] +name = "bottle" +version = "0.12.23" +description = "Fast and simple WSGI-framework for small web-applications." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "exceptiongroup" +version = "1.0.4" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "paste" +version = "3.5.2" +description = "Tools for using a Web Server Gateway Interface stack" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.4.0" + +[package.extras] +flup = ["flup"] +openid = ["python-openid"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["pytest-benchmark", "pytest"] +dev = ["tox", "pre-commit"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.2.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.20.2" +description = "Pytest support for asyncio" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pytest = ">=6.1.0" + +[package.extras] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)", "flaky (>=3.5.0)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "python-dotenv" +version = "0.21.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typer" +version = "0.7.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=7.1.1,<9.0.0" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "shellingham (>=1.3.0,<2.0.0)", "rich (>=10.11.0,<13.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "pillow (>=9.3.0,<10.0.0)", "cairosvg (>=2.5.2,<3.0.0)"] +test = ["shellingham (>=1.3.0,<2.0.0)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "coverage (>=6.2,<7.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "mypy (==0.910)", "black (>=22.3.0,<23.0.0)", "isort (>=5.0.6,<6.0.0)", "rich (>=10.11.0,<13.0.0)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.10" +content-hash = "378d1cbceb4b319261334ce6711477ffb7cfefbcfd6efbc4648276a78a63c2db" + +[metadata.files] +attrs = [] +boddle = [] +bottle = [] +click = [] +colorama = [] +exceptiongroup = [] +iniconfig = [] +packaging = [] +paste = [] +pluggy = [] +pyparsing = [] +pytest = [] +pytest-asyncio = [] +python-dotenv = [] +six = [] +tomli = [] +typer = [] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..896a6aa --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,30 @@ +[tool.poetry] +name = "grooveondemand" +version = "0.1.0" +description = "audio playlist server" +authors = ["evilchili "] +license = "MIT License" +packages = [ + { include = 'groove' } +] + +[tool.poetry.dependencies] +python = "^3.10" +bottle = "^0.12.23" +typer = "^0.7.0" +python-dotenv = "^0.21.0" +Paste = "^3.5.2" + +[tool.poetry.dev-dependencies] +pytest = "^7.2.0" +pytest-asyncio = "^0.20.2" +boddle = "^0.2.9" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + + +[tool.poetry.scripts] +groove = "groove.cli:app" + diff --git a/test/test_ondemand.py b/test/test_ondemand.py new file mode 100644 index 0000000..9b3945e --- /dev/null +++ b/test/test_ondemand.py @@ -0,0 +1,7 @@ +from boddle import boddle +from groove import ondemand + + +def test_ondemand_server(): + with boddle(): + assert ondemand.index() == 'Groovy.'