mirror of
https://github.com/enpaul/peewee-plus.git
synced 2025-10-29 15:45:16 +00:00
Compare commits
30 Commits
1.0.0
...
0693d19f7a
| Author | SHA1 | Date | |
|---|---|---|---|
|
0693d19f7a
|
|||
|
2ddf57a73f
|
|||
| 1fe2eff40a | |||
| 5df974faa5 | |||
| 0d1a142e43 | |||
| 5e68ee3055 | |||
| f9d1f9ecd2 | |||
| d5899d61c7 | |||
| 750d3c07b6 | |||
| ac342d4dc6 | |||
| 6e3c9e8139 | |||
| 23b6359d86 | |||
| 7ecd592ae0 | |||
| 6f97ff74e0 | |||
| 5520faef88 | |||
| 60bdfbfb17 | |||
| d5d400e0a6 | |||
| e98aa73a8d | |||
| 4f5e007d7d | |||
| 134c28fd92 | |||
|
|
dac554e8d4 | ||
| 44ad5da339 | |||
| ef8800059f | |||
| c6cab6ce2d | |||
| 6e9c3c2521 | |||
| 02642312fb | |||
| 8076d8cd29 | |||
| d2f66ce40e | |||
| d33ffd3d8c | |||
| b8a684cec7 |
35
.github/scripts/setup-env.sh
vendored
Executable file
35
.github/scripts/setup-env.sh
vendored
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Environment setup script for the local project. Intended to be used with automation
|
||||
# to create a repeatable local environment for tests to be run in. The python env
|
||||
# this script creates can be accessed at the location defined by the CI_VENV variable
|
||||
# below.
|
||||
|
||||
set -e;
|
||||
|
||||
CI_CACHE=$HOME/.cache;
|
||||
INSTALL_POETRY_VERSION="${POETRY_VERSION:-1.4.1}";
|
||||
|
||||
mkdir --parents "$CI_CACHE";
|
||||
|
||||
command -v python;
|
||||
python --version;
|
||||
|
||||
curl --location https://install.python-poetry.org \
|
||||
--output "$CI_CACHE/install-poetry.py" \
|
||||
--silent \
|
||||
--show-error;
|
||||
python "$CI_CACHE/install-poetry.py" \
|
||||
--version "$POETRY_VERSION" \
|
||||
--yes;
|
||||
poetry --version --no-ansi;
|
||||
poetry run pip --version;
|
||||
|
||||
poetry install \
|
||||
--sync \
|
||||
--no-ansi \
|
||||
--no-root \
|
||||
--only ci;
|
||||
|
||||
poetry env info;
|
||||
poetry run tox --version;
|
||||
92
.github/workflows/ci.yaml
vendored
Normal file
92
.github/workflows/ci.yaml
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
name: CI
|
||||
on:
|
||||
pull_request:
|
||||
types: ["opened", "synchronize"]
|
||||
push:
|
||||
branches: ["devel"]
|
||||
env:
|
||||
POETRY_VERSION: 1.4.1
|
||||
jobs:
|
||||
Test:
|
||||
name: Python ${{ matrix.python.version }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python:
|
||||
- version: "3.7"
|
||||
toxenv: py37
|
||||
- version: "3.8"
|
||||
toxenv: py38
|
||||
- version: "3.9"
|
||||
toxenv: py39
|
||||
- version: "3.10"
|
||||
toxenv: py310
|
||||
- version: "3.11"
|
||||
toxenv: py311
|
||||
fail-fast: true
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Install Python ${{ matrix.python.version }}
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python.version }}
|
||||
|
||||
- name: Configure Job Cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cache/pip
|
||||
~/.cache/pypoetry/cache
|
||||
~/.poetry
|
||||
# Including the hashed poetry.lock in the cache slug ensures that the cache
|
||||
# will be invalidated, and thus all packages will be redownloaded, if the
|
||||
# lockfile is updated
|
||||
key: ${{ runner.os }}-${{ matrix.python.toxenv }}-${{ hashFiles('**/poetry.lock') }}
|
||||
|
||||
- name: Configure Path
|
||||
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Configure Environment
|
||||
run: .github/scripts/setup-env.sh
|
||||
|
||||
- name: Run Toxenv ${{ matrix.python.toxenv }}
|
||||
run: poetry run tox -e ${{ matrix.python.toxenv }}
|
||||
Check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Install Python 3.10
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
|
||||
- name: Configure Job Cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cache/pip
|
||||
~/.cache/pypoetry/cache
|
||||
~/.poetry
|
||||
# Hardcoded 'py310' slug here lets this cache piggyback on the 'py310' cache
|
||||
# that is generated for the tests above
|
||||
key: ${{ runner.os }}-py310-${{ hashFiles('**/poetry.lock') }}
|
||||
|
||||
- name: Configure Path
|
||||
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Configure Environment
|
||||
run: .github/scripts/setup-env.sh
|
||||
|
||||
- name: Run Static Analysis Checks
|
||||
run: poetry run tox -e static
|
||||
|
||||
- name: Run Static Analysis Checks (Tests)
|
||||
run: poetry run tox -e static-tests
|
||||
|
||||
- name: Run Security Checks
|
||||
run: poetry run tox -e security
|
||||
@@ -11,7 +11,6 @@
|
||||
# --disable=W"
|
||||
disable=logging-fstring-interpolation
|
||||
,logging-format-interpolation
|
||||
,bad-continuation
|
||||
,line-too-long
|
||||
,ungrouped-imports
|
||||
,typecheck
|
||||
|
||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -2,6 +2,30 @@
|
||||
|
||||
See also: [Github Release Page](https://github.com/enpaul/peewee-plus/releases).
|
||||
|
||||
## Version 1.2.1
|
||||
|
||||
View this release on: [Github](https://github.com/enpaul/peewee-plus/releases/tag/1.2.1),
|
||||
[PyPI](https://pypi.org/project/peewee-plus/1.2.1/)
|
||||
|
||||
- Add PyPI classifier for Python 3.11
|
||||
- Fix SQLite variable limit determination to account for changes in SQLite 3.32
|
||||
|
||||
## Version 1.2.0
|
||||
|
||||
View this release on: [Github](https://github.com/enpaul/peewee-plus/releases/tag/1.2.0),
|
||||
[PyPI](https://pypi.org/project/peewee-plus/1.2.0/)
|
||||
|
||||
- Remove support for Python 3.6
|
||||
- Update development workflows to use Poetry 1.2
|
||||
- Fix nullable enums raising an `IntegrityError` when value is `None` (#1)
|
||||
|
||||
## Version 1.1.0
|
||||
|
||||
View this release on: [Github](https://github.com/enpaul/peewee-plus/releases/tag/1.1.0),
|
||||
[PyPI](https://pypi.org/project/peewee-plus/1.1.0/)
|
||||
|
||||
- Add decorator function for wrapping callables in a flat database transaction
|
||||
|
||||
## Version 1.0.0
|
||||
|
||||
View this release on: [Github](https://github.com/enpaul/peewee-plus/releases/tag/1.0.0),
|
||||
|
||||
4
Makefile
4
Makefile
@@ -33,11 +33,11 @@ source: ## Build Python source distribution package
|
||||
build: clean wheel source; ## Build all distribution packages
|
||||
|
||||
test: clean-tox ## Run the project testsuite(s)
|
||||
poetry run tox
|
||||
poetry run tox --parallel
|
||||
|
||||
publish: clean test build ## Build and upload to pypi (requires $PYPI_API_KEY be set)
|
||||
@poetry publish --username __token__ --password $(PYPI_API_KEY)
|
||||
|
||||
dev: ## Create local dev environment
|
||||
poetry install --remove-untracked
|
||||
poetry install --sync --with dev --with ci --with test --with security --with static
|
||||
poetry run pre-commit install
|
||||
|
||||
31
README.md
31
README.md
@@ -2,7 +2,9 @@
|
||||
|
||||
Various extensions, helpers, and utilities for [Peewee](http://peewee-orm.com)
|
||||
|
||||
[](https://github.com/enpaul/peewee-plus/actions)
|
||||
[](https://pypi.org/project/peewee-plus/)
|
||||
[](https://libraries.io/pypi/peewee-plus)
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://www.python.org)
|
||||
[](https://github.com/psf/black)
|
||||
@@ -20,7 +22,7 @@ release history.
|
||||
|
||||
## Installing
|
||||
|
||||
Peewee+ is [available on PyPI](https://pypi.org/project/peewee-plus/) and can be installed
|
||||
peewee+ is [available on PyPI](https://pypi.org/project/peewee-plus/) and can be installed
|
||||
using Poetry, Pipenv, or Pip:
|
||||
|
||||
```bash
|
||||
@@ -55,26 +57,29 @@ when using SQLite
|
||||
|
||||
### Functions
|
||||
|
||||
[`calc_batch_size`](https://github.com/enpaul/peewee-plus/blob/1.0.0/peewee_plus.py#L68) -
|
||||
Helper function for determining how to batch a create/update query with SQLite
|
||||
[`calc_batch_size`](blob/devel/peewee_plus.py#L93) - Helper function for writing
|
||||
backend-agnostic batch queries while accounting for the
|
||||
[SQLite max variable limit](https://www.sqlite.org/limits.html#max_variable_number).
|
||||
|
||||
[`flat_transaction`](blob/devel/peewee_plus.py#L159) - Decorator function for wrapping
|
||||
callables in a database transaction without creating nested transactions
|
||||
|
||||
### Classes
|
||||
|
||||
[`PathField`](https://github.com/enpaul/peewee-plus/blob/1.0.0/peewee_plus.py#134) - A
|
||||
Peewee database field for storing
|
||||
[`PathField`](blob/devel/peewee_plus.py#204) - A Peewee database field for storing
|
||||
[Pathlib](https://docs.python.org/3/library/pathlib.html) objects, optionally relative to
|
||||
a runtime value.
|
||||
|
||||
[`PrecisionFloatField`](https://github.com/enpaul/peewee-plus/blob/1.0.0/peewee_plus.py#L192)
|
||||
\- A Peewee database field for storing floats while specifying the
|
||||
[`PrecisionFloatField`](blob/devel/peewee_plus.py#L262) - A Peewee database field for
|
||||
storing floats while specifying the
|
||||
[MySQL precision parameters](https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html)
|
||||
`M` and `D`
|
||||
|
||||
[`JSONField`](https://github.com/enpaul/peewee-plus/blob/1.0.0/peewee_plus.py#L222) - A
|
||||
Peewee database field for storing arbitrary JSON-serializable data
|
||||
[`JSONField`](blob/devel/peewee_plus.py#L293) - A Peewee database field for storing
|
||||
arbitrary JSON-serializable data
|
||||
|
||||
[`EnumField`](https://github.com/enpaul/peewee-plus/blob/1.0.0/peewee_plus.py#L277) - A
|
||||
Peewee database field for storing Enums by name
|
||||
[`EnumField`](blob/devel/peewee_plus.py#L348) - A Peewee database field for storing Enums
|
||||
by name
|
||||
|
||||
## For Developers
|
||||
|
||||
@@ -94,8 +99,8 @@ are tracked on [Github](https://github.com/enpaul/peewee-plus/releases),
|
||||
[fork the repository](https://docs.github.com/en/enterprise/2.20/user/github/getting-started-with-github/fork-a-repo)
|
||||
and [open a pull request](https://github.com/enpaul/peewee-plus/compare).
|
||||
|
||||
Developing this project requires at least [Python 3.7](https://www.python.org/downloads/)
|
||||
and at least [Poetry 1.0](https://python-poetry.org/docs/#installation). GNU Make can
|
||||
Developing this project requires [Python 3.10](https://www.python.org/downloads/) or later
|
||||
and [Poetry 1.2](https://python-poetry.org/docs/#installation) or later. GNU Make can
|
||||
optionally be used to quickly setup a local development environment, but this is not
|
||||
required.
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
"""Peewee+
|
||||
"""peewee+
|
||||
|
||||
Various extensions, helpers, and utilities for `Peewee`_
|
||||
|
||||
:constant SQLITE_DEFAULT_VARIABLE_LIMIT: The default number of variables that a single SQL query
|
||||
can contain when interfacing with SQLite. The actual
|
||||
@@ -10,9 +12,13 @@
|
||||
SQLite database connection. The value for this constant is taken
|
||||
directly from the `Peewee documentation`_
|
||||
|
||||
.. _`Peewee documentation`: http://docs.peewee-orm.com/en/latest/peewee/database.html#recommended-settings
|
||||
.. _`Peewee`: https://docs.peewee-orm.com/en/latest/
|
||||
|
||||
.. _`Peewee documentation`: https://docs.peewee-orm.com/en/latest/peewee/database.html#recommended-settings
|
||||
"""
|
||||
import contextlib
|
||||
import enum
|
||||
import functools
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
@@ -26,7 +32,7 @@ import peewee
|
||||
|
||||
|
||||
__title__ = "peewee-plus"
|
||||
__version__ = "1.0.0"
|
||||
__version__ = "1.2.1"
|
||||
__license__ = "MIT"
|
||||
__summary__ = "Various extensions, helpers, and utilities for Peewee"
|
||||
__url__ = "https://github.com/enpaul/peewee-plus/"
|
||||
@@ -42,6 +48,7 @@ __all__ = [
|
||||
"__authors__",
|
||||
"calc_batch_size",
|
||||
"EnumField",
|
||||
"flat_transaction",
|
||||
"JSONField",
|
||||
"PathField",
|
||||
"PrecisionFloatField",
|
||||
@@ -59,7 +66,25 @@ SQLITE_DEFAULT_PRAGMAS: Dict[str, Any] = {
|
||||
}
|
||||
|
||||
|
||||
SQLITE_DEFAULT_VARIABLE_LIMIT: int = 999
|
||||
SQLITE_DEFAULT_VARIABLE_LIMIT: int
|
||||
|
||||
# With SQLite 3.32 (2020-05-22) the devs bumped the default variable limit to
|
||||
# 32766. This logic attemps to import the sqlite3 bindings and determine whether
|
||||
# the version of the installed SQLite version is greater or equal to 3.32. If
|
||||
# the sqlite3 bindings cannot be imported (either because they aren't installed)
|
||||
# or because the platform is using SQLite 1 or 2 then it falls back to the
|
||||
# 999 value.
|
||||
try:
|
||||
import sqlite3
|
||||
except ImportError:
|
||||
SQLITE_DEFAULT_VARIABLE_LIMIT = 999
|
||||
else:
|
||||
if sqlite3.sqlite_version_info[0] >= 3 or (
|
||||
sqlite3.sqlite_version_info[0] == 3 and sqlite3.sqlite_version_info[1] >= 32
|
||||
):
|
||||
SQLITE_DEFAULT_VARIABLE_LIMIT = 32766
|
||||
else:
|
||||
SQLITE_DEFAULT_VARIABLE_LIMIT = 999
|
||||
|
||||
|
||||
T = TypeVar("T", bound=peewee.Model)
|
||||
@@ -131,7 +156,52 @@ def calc_batch_size(
|
||||
return len(models)
|
||||
|
||||
|
||||
class PathField(peewee.CharField):
|
||||
def flat_transaction(interface: peewee.Database):
|
||||
"""Database transaction wrapper that avoids nested transactions
|
||||
|
||||
A decorator that can be used to decorate functions or methods so that the entire callable
|
||||
is executed in a single transaction context. If a transaction is already open then it will
|
||||
be reused rather than opening a nested transaction.
|
||||
|
||||
Example usage:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
db = peewee.SqliteDatabase("test.db")
|
||||
|
||||
|
||||
@flat_transaction(db)
|
||||
def subquery():
|
||||
...
|
||||
|
||||
|
||||
@flat_transaction(db)
|
||||
def my_query():
|
||||
...
|
||||
subquery()
|
||||
|
||||
|
||||
# This call opens only a single transaction
|
||||
my_query()
|
||||
|
||||
:param interface: Peewee database interface that should be used to open the transaction
|
||||
"""
|
||||
|
||||
def outer(func):
|
||||
@functools.wraps(func)
|
||||
def inner(*args, **kwargs):
|
||||
with interface.atomic() if not interface.in_transaction() else contextlib.nullcontext():
|
||||
return func(*args, **kwargs)
|
||||
|
||||
return inner
|
||||
|
||||
return outer
|
||||
|
||||
|
||||
# TODO: The disable=abstract-method pragmas below are to get around new linting warnings
|
||||
# in pylint>2.12, but they haven't been addressed properly. They should be revisited
|
||||
# and fixed properly in the future.
|
||||
class PathField(peewee.CharField): # pylint: disable=abstract-method
|
||||
"""Field class for storing file paths
|
||||
|
||||
This field can be used to simply store pathlib paths in the database without needing to
|
||||
@@ -189,7 +259,7 @@ class PathField(peewee.CharField):
|
||||
)
|
||||
|
||||
|
||||
class PrecisionFloatField(peewee.FloatField):
|
||||
class PrecisionFloatField(peewee.FloatField): # pylint: disable=abstract-method
|
||||
"""Field class for storing floats with custom precision parameters
|
||||
|
||||
This field adds support for specifying the ``M`` and ``D`` precision parameters of a
|
||||
@@ -206,8 +276,9 @@ class PrecisionFloatField(peewee.FloatField):
|
||||
.. _here: https://stackoverflow.com/a/67476045/5361209
|
||||
|
||||
:param max_digits: Maximum number of digits, combined from left and right of the decimal place,
|
||||
to store for the value.
|
||||
:param decimal_places: Maximum number of digits that will be stored after the decimal place
|
||||
to store for the value; corresponds to the ``M`` MySQL precision parameter.
|
||||
:param decimal_places: Maximum number of digits that will be stored after the decimal place;
|
||||
corresponds to the ``D`` MySQL precision parameter.
|
||||
"""
|
||||
|
||||
def __init__(self, *args, max_digits: int = 10, decimal_places: int = 4, **kwargs):
|
||||
@@ -219,10 +290,10 @@ class PrecisionFloatField(peewee.FloatField):
|
||||
return [self.max_digits, self.decimal_places]
|
||||
|
||||
|
||||
class JSONField(peewee.TextField):
|
||||
class JSONField(peewee.TextField): # pylint: disable=abstract-method
|
||||
"""Field class for storing JSON-serializable data
|
||||
|
||||
This field can be used to store a dictionary of data directly in the database without needing
|
||||
This field can be used to store a dictionary of data directly in the database
|
||||
without needing to call :func:`json.dumps` and :func:`json.loads` directly.
|
||||
|
||||
::
|
||||
@@ -274,7 +345,7 @@ class JSONField(peewee.TextField):
|
||||
) from err
|
||||
|
||||
|
||||
class EnumField(peewee.CharField):
|
||||
class EnumField(peewee.CharField): # pylint: disable=abstract-method
|
||||
"""Field class for storing Enums
|
||||
|
||||
This field can be used for storing members of an :class:`enum.Enum` in the database,
|
||||
@@ -319,7 +390,11 @@ class EnumField(peewee.CharField):
|
||||
|
||||
def python_value(self, value: str) -> enum.Enum:
|
||||
try:
|
||||
return self.enumeration[super().python_value(value)]
|
||||
return (
|
||||
None
|
||||
if value is None and self.null
|
||||
else self.enumeration[super().python_value(value)]
|
||||
)
|
||||
except KeyError:
|
||||
raise peewee.IntegrityError(
|
||||
f"Enum {self.enumeration.__name__} has no value with name '{value}'"
|
||||
|
||||
3246
poetry.lock
generated
3246
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "peewee-plus"
|
||||
version = "1.0.0"
|
||||
version = "1.2.1"
|
||||
description = "Various extensions, helpers, and utilities for Peewee"
|
||||
authors = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"]
|
||||
repository = "https://github.com/enpaul/peewee-plus/"
|
||||
@@ -17,40 +17,57 @@ classifiers = [
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.6",
|
||||
"Programming Language :: Python :: 3.7",
|
||||
"Programming Language :: Python :: 3.8",
|
||||
"Programming Language :: Python :: 3.9",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: Implementation :: CPython",
|
||||
"Topic :: Database",
|
||||
"Typing :: Typed"
|
||||
]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.6.1"
|
||||
python = "^3.7.1"
|
||||
peewee = "^3.14.8"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
bandit = "^1.7.1"
|
||||
black = {version = "^21.11b1", python = "^3.7"}
|
||||
blacken-docs = {version = "^1.12.0", python = "^3.7"}
|
||||
ipython = {version = "^7.29.0", python = "^3.7"}
|
||||
mdformat = "^0.6.4"
|
||||
mdformat-gfm = "^0.2"
|
||||
mypy = "^0.910"
|
||||
pre-commit = "^2.15.0"
|
||||
pre-commit-hooks = "^4.0.1"
|
||||
pylint = "^2.11.1"
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^6.2.5"
|
||||
pytest-cov = "^3.0.0"
|
||||
reorder-python-imports = "^2.6.0"
|
||||
safety = "^1.10.3"
|
||||
toml = "^0.10.2"
|
||||
ruamel-yaml = {version = "^0.17.21", python = "^3.10"}
|
||||
# This is a workaround for this issue with the Poetry export
|
||||
# plugin which was blocking the 'security' CI check:
|
||||
#
|
||||
# https://github.com/python-poetry/poetry-plugin-export/issues/176
|
||||
virtualenv = ">=20.15,<20.16"
|
||||
|
||||
[tool.poetry.group.ci.dependencies]
|
||||
poetry = "^1.4.2"
|
||||
tox = "^3.24.4"
|
||||
tox-poetry-installer = {extras = ["poetry"], version = "^0.8.2"}
|
||||
types-toml = "^0.10.1"
|
||||
tox-poetry-installer = {version = "^0.10.0", extras = ["poetry"]}
|
||||
|
||||
[tool.poetry.group.security.dependencies]
|
||||
bandit = {version = "^1.7.1", python = "^3.10"}
|
||||
poetry = {version = "^1.4.2", python = "^3.10"}
|
||||
safety = {version = "^2.2.0", python = "^3.10"}
|
||||
|
||||
[tool.poetry.group.static.dependencies]
|
||||
black = {version = "^22.8.0", python = "^3.10"}
|
||||
blacken-docs = {version = "^1.12.0", python = "^3.10"}
|
||||
mdformat = {version = "^0.6.4", python = "^3.10"}
|
||||
mdformat-gfm = {version = "^0.2", python = "^3.10"}
|
||||
mypy = {version = "^1.2.0", python = "^3.10"}
|
||||
pre-commit = {version = "^2.15.0", python = "^3.10"}
|
||||
pre-commit-hooks = {version = "^4.0.1", python = "^3.10"}
|
||||
pylint = {version = "^2.13.0", python = "^3.10"}
|
||||
reorder-python-imports = {version = "^2.6.0", python = "^3.10"}
|
||||
toml = {version = "^0.10.2", python = "^3.10"}
|
||||
types-toml = {version = "^0.10.1", python = "^3.10"}
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
ipython = {version = "^8.10.0", python = "^3.10"}
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
requires = ["poetry-core>=1.1.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
@@ -17,7 +17,11 @@ def test_sqlite(fakedb):
|
||||
|
||||
data = peewee.IntegerField()
|
||||
|
||||
models = [TestModel(item) for item in range(500)]
|
||||
# Three is just chosen as an arbitrary multiplier to ensure the value is larger than the
|
||||
# sqlite variable limit
|
||||
models = [
|
||||
TestModel(item) for item in range(peewee_plus.SQLITE_DEFAULT_VARIABLE_LIMIT * 3)
|
||||
]
|
||||
assert (
|
||||
peewee_plus.calc_batch_size(models) <= peewee_plus.SQLITE_DEFAULT_VARIABLE_LIMIT
|
||||
)
|
||||
|
||||
53
tox.ini
53
tox.ini
@@ -1,6 +1,6 @@
|
||||
[tox]
|
||||
envlist =
|
||||
py{36,37,38,39,310}
|
||||
py{37,38,39,310,311}
|
||||
static
|
||||
static-tests
|
||||
security
|
||||
@@ -11,11 +11,8 @@ skip_missing_interpreters = true
|
||||
description = Run the tests
|
||||
require_locked_deps = true
|
||||
require_poetry = true
|
||||
locked_deps =
|
||||
pytest
|
||||
pytest-cov
|
||||
ruamel.yaml
|
||||
toml
|
||||
poetry_dep_groups =
|
||||
test
|
||||
commands =
|
||||
pytest {toxinidir}/tests/ \
|
||||
--cov peewee_plus \
|
||||
@@ -24,18 +21,10 @@ commands =
|
||||
|
||||
[testenv:static]
|
||||
description = Static formatting and quality enforcement
|
||||
basepython = python3.8
|
||||
basepython = python3.10
|
||||
ignore_errors = true
|
||||
locked_deps =
|
||||
black
|
||||
blacken-docs
|
||||
mdformat
|
||||
mdformat-gfm
|
||||
mypy
|
||||
reorder-python-imports
|
||||
pre-commit
|
||||
pre-commit-hooks
|
||||
pylint
|
||||
poetry_dep_groups =
|
||||
static
|
||||
commands =
|
||||
pre-commit run \
|
||||
--all-files
|
||||
@@ -47,13 +36,11 @@ commands =
|
||||
|
||||
[testenv:static-tests]
|
||||
description = Static formatting and quality enforcement for the tests
|
||||
basepython = python3.8
|
||||
basepython = python3.10
|
||||
ignore_errors = true
|
||||
locked_deps =
|
||||
mypy
|
||||
pylint
|
||||
pytest
|
||||
types-toml
|
||||
poetry_dep_groups =
|
||||
static
|
||||
test
|
||||
commands =
|
||||
pylint {toxinidir}/tests/ \
|
||||
--rcfile {toxinidir}/.pylintrc
|
||||
@@ -63,13 +50,11 @@ commands =
|
||||
|
||||
[testenv:security]
|
||||
description = Security checks
|
||||
basepython = python3.8
|
||||
basepython = python3.10
|
||||
skip_install = true
|
||||
ignore_errors = true
|
||||
locked_deps =
|
||||
bandit
|
||||
safety
|
||||
poetry
|
||||
poetry_dep_groups =
|
||||
security
|
||||
commands =
|
||||
bandit {toxinidir}/peewee_plus.py \
|
||||
--recursive \
|
||||
@@ -82,7 +67,13 @@ commands =
|
||||
--format requirements.txt \
|
||||
--output {envtmpdir}/requirements.txt \
|
||||
--without-hashes \
|
||||
--dev
|
||||
--with ci \
|
||||
--with test \
|
||||
--with security \
|
||||
--with static \
|
||||
--with dev
|
||||
safety check \
|
||||
--json \
|
||||
--file {envtmpdir}/requirements.txt
|
||||
--file {envtmpdir}/requirements.txt \
|
||||
--output text \
|
||||
# https://github.com/pytest-dev/py/issues/287
|
||||
--ignore 51457
|
||||
|
||||
Reference in New Issue
Block a user