Python helpers and utilities with no dependencies
Project description
NoDeps
Features
Globals to set with nodeps commands
- IPython Profile :mod:
ipython_profile.profile_default.ipython_config:export IPYTHONDIR="$(ipythondir)" - Python Startup :mod:
python_startup.__init__:export PYTHONSTARTUP="$(pythonstartup)"
pytest fixtures
import pytest
from typer.testing import Result
from nodeps.fixtures import skip_docker, Repos, Cli
@skip_docker
def test_skip_docker(local: bool):
"""Fixture to see if or --local passed to pytest or DOCKER or CI.
Examples:
pytest --local
pytest --local tests/test_fixture.py::test_fixture_local
pytest tests/test_fixture.py # docker -> 2 skipped
pytest tests/test_fixture.py # 0 skipped
"""
assert local is False
@pytest.mark.skipif("config.getoption('local') is True", reason='--local option provided')
def test_func_skipif_local_docker(local: bool):
"""Should run if local is False or not --local in command."""
assert local is False
def test_fixture_repos(repos: Repos):
"""Test that repos are created and pushed."""
assert (repos.local.top / "README.md").is_file()
assert repos.local.git.cat_file("-e", "origin/main:README.md") == ""
assert (repos.clone.top / "README.md").is_file()
@pytest.mark.parametrize("cli", [["command", "--option"]], indirect=True)
def test_current(cli: Cli):
assert cli.result.exit_code == 0
assert cli.result.stdout == "main"
@pytest.mark.parametrize("clirun", [["command", "--option"]], indirect=True)
def test_current(clirun: Result):
assert clirun.exit_code == 0
assert clirun.stdout == "main"
pytest --local tests/test_docker.py # in macos to skip
pytest tests/test_docker.py # in docker to skip
IPython extension
Add the following to PyCharm Console:
# noinspection PyUnresolvedReferences
import nodeps
In [1]: %load_ext reload
In [2]: %reload_ext reload
In [3]: reload # magic command
It is the same as:
import IPython
IPython.start_ipython(["--ext=nodeps"])
Env class and LOG
Searches for .env in cwd and up using envsh function
Usage: env = Env().
LOGURU_LEVELwill be set inos.environ.LOG_LEVELwill be set and parsed to int forloggingmodule.logger.setLevel(env.LOG_LEVEL)
Posible values for LOGURU_LEVEL and LOG_LEVEL: "TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL".
LOG_LEVEL also accepts lower case or int.
Searches for settings.ini in cwd and up. If file is found python-decouple is used.
Usage:
var = Env()._config("VAR", default=False, cast=bool)extensions = {*Env()._config('EXTENSIONS', default=str(extensions), cast=decouple.Csv(post_process=set)), *extensions}
To change decouple to use both settings.ini and .env:
import collections
import decouple # type: ignore[attr-defined]
from nodeps import Path
EXTENSIONS = ["foo", "boo"]
cwd = Path.cwd()
files = (
decouple.RepositoryIni(path.absolute()) if path.suffix == ".ini" else decouple.RepositoryEnv(".env")
for file in ("settings.ini", ) # ".env" process by envbash()
if (path := cwd.find_up())
)
config = decouple.Config(collections.ChainMap(*files))
EXTENSIONS = {
*config(
"EXTENSIONS", default=",".join(EXTENSIONS), cast=decouple.Csv(post_process=set)
),
*EXTENSIONS,
}
Automatic installation of packages
PipMetaPathFinder is a sys.meta_path finder that automatically installs packages when they are imported.
Task dependencies
venvrunswriteandrequirementsbuildrunsvenv,completions,docsandclean.testsrunsbuild,ruff,pytestandtoxpublishrunstests,commit,tag,push,twineandclean
Completions
To install completions after a package is installed:
p completions [name] or completions [name]
Repos
To synchronize (push or pull) all repos under ~/Archive and $HOME run: repos --sync or p repos --sync
pyproject.toml
Project
Project section information in pyproject.toml is automatically updated when Project.write() is called, is key is not in project.
An empty pyproject.toml is needed.
Extras
To use all extras from nodeps to your project, add the following to your pyproject.toml:
[project.optional-dependencies]
dev = [
"nodeps[dev]",
]
docs conf.py and requirements.txt
doc conf.py, reference.md and requirements.txt are automatically updated when Project.write() is called.
usage.md requires a click instance in __main__.py:
<app_name>_click = typer.main.get_command(<Typer instance>)
# Usage
```{eval-rst}
.. click:: pdf.__main__:<app_name>_click
:prog: reembolsos
:nested: full
Makefile
brew:
@p $@
browser:
@$@
.PHONY: build
build: # run: write, docs, clean and venv (requirements)
@$@
builds: # run: write, docs, clean and venv (requirements)
@$@
clean:
@$@
commit: tests
@$@
completions:
@$@
coverage:
@p $@
.PHONY: docs
docs:
@$@
latest:
@$@
next:
@$@
nodeps:
@python3 -m pip install --upgrade -q $@[all,dev]
publish: # runs: docs, tests (build (clean, venv (requirements)), pytest, ruff & tox), commit, tag, push, twine & clean
@$@
pyenv:
@pyenv install 3.11
@pyenv install 3.12-dev
pytest:
@p $@
pytests:
@$@
requirement:
@$@ --install
requirements:
@$@
ruff:
@p $@
secrets:
@$@
test:
@p $@
.PHONY: tests
tests: # runs: build (clean, venv (requirements)), pytest, ruff and tox
@$@
tox:
@p $@
twine:
@p $@
.PHONY: venv
venv: # runs: requirements
@$@
venvs: # runs: requirements
@$@
write:
@p $@
.DEFAULT_GOAL := publish
Extras:
ansi: forgetstdoutandstripfunction usingstrip-ansilibrarycli: fortyperto have CLI forpcommand (autoinstall withpipmetapathfinder)echo: forechopackage usingclicklibraryenv: forEnvclass usingpython-decouplelibrarylog: forloggerfunction usinglogurulibrarypickle: forcachefunction usingjsonpickleandstructloglibrariespth: forPTHBuildPy,PTHDevelop,PTHEasyInstallandPTHInstallLibclasses usingsetuptoolslibrarypretty: forrichlibrary install andicecream.icconfigurationrepo: forRepoclass usinggitpythonlibraryrequests: forpython_latest,python_versionsandrequest_x_api_key_jsonfunctions that use therequestsandbeautifulsoup4libraries
tomlkit package is autoinstall with pipmetapathfinder for pyproject.toml file manipulation in Project class and __main__.py.
Aggregated extras:
- nodeps[all] includes all extras except dev.
- nodeps[dev] includes all dev extras.
- nodeps[full] includes all extras including dev [all,dev].
Test imports uninstalling: pip uninstall loguru beautifulsoup4 click jsonpickle strip_ansi structlog typer
PTH
Add to your setup.cfg and <mypackage>.pth file in your package.
[options]
cmdclass =
build_py = nodeps.PTHBuildPy
develop = nodeps.PTHDevelop
easy_install = nodeps.PTHEasyInstall
install_lib = nodeps.PTHInstallLib
[options.package_data]
mypackage =
*.pth
Add to your pyproject.toml:
[build-system]
requires = [
"nodeps",
"setuptools >= 68.2.2, <69",
"setuptools_scm >= 8.0.3, <9",
"wheel >= 0.41.2, <1"
]
To verify that nodeps.pth is being installed use:
python -c "import venv; print(venv.CORE_VENV_DEPS)"
Post install
File _post_install.py is automatically executed after pip install with the pip install patch.
Installation
You can install nodeps via pip from PyPI:
$ pip install nodeps
You can install nodeps with extras pip from PyPI:
$ pip install nodeps[repo]
To install all extras but [dev] (not including development extras):
$ pip install nodeps[all]
tests in docker
./docker/docker.sh 3.11-slim-bash
License
Distributed under the terms of the MIT license, nodeps is free and open source software.
Issues
If you encounter any problems, please file an issue along with a detailed description.
Credits
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nodeps-0.3.3-py3-none-any.whl.
File metadata
- Download URL: nodeps-0.3.3-py3-none-any.whl
- Upload date:
- Size: 153.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ed5024735f21bc63bde65935aec573c785940214fe8d595e4b9aa95f6b8eaef
|
|
| MD5 |
94723f827e053ddc415c22b9e0558cbd
|
|
| BLAKE2b-256 |
363f799703e88b2da659cdf7dcb4b432f3521a66f6cfc7ab5bf2fd4cfe148dda
|