Releases: todofixthis/filters
Filters v3.4.0
Breaking changes
- Added support for Python 3.12, dropped support for Python 3.9.
- Removed
filters.__version__
.- If needed, use
importlib.metadata.version()
to check the library's version string.
- If needed, use
Other changes
- Added documentation build step to GitHub Actions (to check for build warnings/errors only).
- Added now-required
readthedocs.yaml
file for RTD documentation builds. - Fixed some reStructuredText parse errors in tests and docstrings.
SHA256 Checksums
3ccaa18de8e7ff10cf89d6bbe5ba80dd3e0aa5524fa17d32822abdbb81a2ad41 phx-filters-3.4.0.tar.gz
5ad74dfa75e13764191bf7a333d4de57dcf9c7e40bca418096b51050808f7bdf phx_filters-3.4.0-py3-none-any.whl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
⚠️ This release drops support for Python 3.9 ⚠️
## Breaking changes
* Added support for Python 3.12, dropped support for Python 3.9.
* Removed `filters.__version__`.
* If needed, use [`importlib.metadata.version()`](https://docs.python.org/3/library/importlib.metadata.html#distribution-versions) to check the library's version string.
## Other changes
* Added documentation build step to GitHub Actions (to check for build warnings/errors only).
* Added now-required `readthedocs.yaml` file for RTD documentation builds.
* Fixed some reStructuredText parse errors in tests and docstrings.
# SHA256 Checksums
* `3ccaa18de8e7ff10cf89d6bbe5ba80dd3e0aa5524fa17d32822abdbb81a2ad41 phx-filters-3.4.0.tar.gz`
* `5ad74dfa75e13764191bf7a333d4de57dcf9c7e40bca418096b51050808f7bdf phx_filters-3.4.0-py3-none-any.whl`
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEnIUO0KsYbEbt5eQY330i9k++dSEFAmUfbsgACgkQ330i9k++
dSEysg/+JXJuATjVKl3CcprtLWnQJ3QJlM39oSPs5mGNNxN/EL5CrIYFE5oxQWIN
bmzxkldT93ViMPLuVFa6u9rBmwLeQoNunGx3nNHcKQ05qOsDuoYccpGNBY0BYa7n
bfCB14ATvpkh1TCnxHm8rsXU3a8orWWk3UjFHe4Re7PEEkDKG9DJGIoz3987ejgO
DAXiryYyUj9EydIdHg0b3KInhBmuVyBvYM1N5zPLOYPJVa3ms8zxHWkj5lsydeQf
9yUCNcaGAYedm8u5U+cI89R6P89KZR7aAwsL0ccMEvJFAohi4sYrrGVqOBKe3hrp
hevPidwKB6SY18nv1z+wuVhpP8KKb7O0YX2flIAX6xNtKK4xKkiEoFWSZdmboz7M
ynlaw4rRHaqp2ybzGSP/rZqWxqXa5AGkwBG2E6e7s9mFLi03scfx474+brnVc2gQ
SL1wMaL6PdeWBly8J1Z4WBfDoBqjioFyjDHXqF4dbkOVGBjxeFNI5lnt0FxAccSY
Eb++eG/oE5mJsaKncWU2uSzlOYiBJHkoAAGOFkwhMBRhoazYIqWrZyDZUY/p79qH
/4YxbLU19jbE6feFE9krcJqY8y6wY80QzVefWi8y+GHq0PRw2EGo8oD+ub6lFuem
oD12JHjMSIr7xHgVUvHsno9Zq6PQ2txXukvn2h5G/Qd2j5laVnw=
=Z6yB
-----END PGP SIGNATURE-----
Filters v3.3.0
⚠️ Backwards-Incompatible Changes
-
[#14] If
Optional
is configured with adefault
that is callable, it will now calldefault
to get the replacement value.-
If your code relies on the previous behaviour, pass
call_default=False
to the filter:import filters as f # New behaviour: the replacement value is an empty list instead of ``list``: runner = f.FilterRunner(f.Optional(default=list), None) assert runner.cleaned_data == [] # To get the previous behaviour, add `call_default=False` to the filter initialiser: runner = f.FilterRunner(f.Optional(default=list, call_default=False), None) assert runner.cleaned_data is list
-
-
Choice
now raises aFilterError
when initialised with an empty collection of valid choices:import filters as f try: # This raises a FilterError; must be at least 1 valid choice. f.Choice(choices=[]) except f.FilterError: pass
-
MaxBytes
now raises aFilterError
when initialised with amax_bytes
value less than 1:import filters as f try: # This raises a FilterError; ``max_bytes`` must be at least 1 f.MaxBytes(max_bytes=0) except f.FilterError: pass
Other Changes
- [#15] Added
MaxChars
filter for checking/truncating unicode strings. - [#15] Added
truncate
param toMaxLength
. - Made
MaxBytesTestCase
more portable (just in case you're running the unit tests on a little-endian system 🥚). - [#28] Set up GitHub Actions for CI.
- Lots of code cleanup, especially in comments.
SHA256 Checksums
2fc1423cb7631678e4885d50de53c4bf930267ed178e29a603c913ab684e4cd3 phx-filters-3.3.0.tar.gz
e8f048c20937b3566c02fc0bb90902714ba81f7aa31bbcdd030e3cd26ca5939b phx_filters-3.3.0-py3-none-any.whl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
# ⚠️ Backwards-Incompatible Changes
* [#14] If `Optional` is configured with a `default` that is callable, it will now call `default` to get the replacement value.
* If your code relies on the previous behaviour, pass `call_default=False` to the filter:
```py
import filters as f
# New behaviour: the replacement value is an empty list instead of ``list``:
runner = f.FilterRunner(f.Optional(default=list), None)
assert runner.cleaned_data == []
# To get the previous behaviour, add `call_default=False` to the filter initialiser:
runner = f.FilterRunner(f.Optional(default=list, call_default=False), None)
assert runner.cleaned_data is list
```
* `Choice` now raises a `FilterError` when initialised with an empty collection of valid choices:
```py
import filters as f
try:
# This raises a FilterError; must be at least 1 valid choice.
f.Choice(choices=[])
except f.FilterError:
pass
```
* `MaxBytes` now raises a `FilterError` when initialised with a `max_bytes` value less than 1:
```py
import filters as f
try:
# This raises a FilterError; ``max_bytes`` must be at least 1
f.MaxBytes(max_bytes=0)
except f.FilterError:
pass
```
# Other Changes
* [#15] Added `MaxChars` filter for checking/truncating unicode strings.
* [#15] Added `truncate` param to `MaxLength`.
* Made `MaxBytesTestCase` more portable (just in case you're running the unit tests on a little-endian system 🥚).
* [#28] Set up GitHub Actions for CI.
* Lots of code cleanup, especially in comments.
# SHA256 Checksums
* `2fc1423cb7631678e4885d50de53c4bf930267ed178e29a603c913ab684e4cd3 phx-filters-3.3.0.tar.gz`
* `e8f048c20937b3566c02fc0bb90902714ba81f7aa31bbcdd030e3cd26ca5939b phx_filters-3.3.0-py3-none-any.whl`
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEnIUO0KsYbEbt5eQY330i9k++dSEFAmPlgOcACgkQ330i9k++
dSFLZhAAmuKxa3jko06CyUh93N/MnqQKsp4Us7To3d9ng3IKmt4r5Tq++KG7LHg2
6Mgm+erCcyEPiumQRhoDcTYwhCZIqZvWh4fPWEqvNl81qo54WDb6q5llg40UXp1n
lqmR6mc8XY4jxFxK8vGSHadroKslwImvIAUBsM2BnbI7mkphGqXKFRFRQOR2pVZ6
7Zf4zWmqk2qHtHK6IFriZjsZNLrsMOg0002G0RRtynvlTi1XN/ireGMYmfAOGXdb
QUnPYCc/gkyF3Y1F+w3WKSjxJiMAPAE3z/1iOoXq16SXqt6uiV45BlOp+d9ewQtJ
CFWdBkQ4K5sc/fTS9DaWyHz3itIIytbnFkDI90JhXdW4tBhXDv1U4s/USvpDZGAk
giqK9Hl1LpBKPCC6YQ/0mgl5J1kvHtC1kcWZR4xjwbZ/2OT6Hz2WtK7vNZk52FQd
01ip3Ow0zGJiTjdCs3uCxtFM5zchjh18pTXtFGnOwKOipjz6S5Tjd/fNf4sbtiJg
a6Hbk4PQuOrMKfMXTx8CXn7f9VodqaH4wJpgB5rg0ssV2Cbtv2hpkmfIGV2k1btQ
mm/i1m2jTDIxzGQL7qpIVhAL+LvoEzd02CUEV49UJqKSe4xZYUAS6Lo08k0bJ3Kf
wF8oFyKiCiEVHVdx0C/V1xnuB+5hswiobVD/GmDBPTkwsXFONNc=
=TiaB
-----END PGP SIGNATURE-----
Filters v3.2.1
Changelog
- Added documentation for
Choice.case_sensitive
. I knew I'd forgotten something 😅
Sha256 Checksums
af0c3aebe34aa654c18975fe59a9307055584d0980c203bf010f7b764900ee70 phx-filters-3.2.1.tar.gz
340526fa37e764007e009f6fe96434bbdbc4f9b97599ad10d7743a211736ee92 phx_filters-3.2.1-py3-none-any.whl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
**⚠️ Filters v3.2.0 includes some backwards-incompatible changes; please review the [release notes for v3.2.0](https://github.com/todofixthis/filters/releases/tag/3.2.0) before updating!**
# Changelog
* Added documentation for `Choice.case_sensitive`. I knew I'd forgotten something 😅
# Sha256 Checksums
* `af0c3aebe34aa654c18975fe59a9307055584d0980c203bf010f7b764900ee70 phx-filters-3.2.1.tar.gz`
* `340526fa37e764007e009f6fe96434bbdbc4f9b97599ad10d7743a211736ee92 phx_filters-3.2.1-py3-none-any.whl`
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEnIUO0KsYbEbt5eQY330i9k++dSEFAmPgjZ0ACgkQ330i9k++
dSGKcw//f4OpjBIVlhtH3JoTUk/jrAGcTqClNA1OuOdiIIBmZqxrD523HNPzY7bO
FqYYCQ1pgkpJiJsA8p9yGqjVqd5OYIvKxsPPXBXsmqTWgXjIyrPShbHZF3jmI817
TxUWZLcPymDh6lDl/yuucDpxpEFNGLPPsvURNDaIe/vl1epqvAUYXssq8mrQKH/u
uWTqKeNnQKWNNYlFncyGMTNLgK20AywtvLhg7w5IOogIOWfkUhfLKuGMmPRSIbDZ
/4nYCHsDvqa3hVtN27tG5M3+MKzjFkk58RhM2qeC97IqdWflEzho78g4m5N/QTyN
eZ78vKSRczUYpBExQ4WnOnz8qrC8OGHZumaXtXe7/GQjxaAYnPFxKO/deKRk7fqz
QNCLnkwA7JxKab60yIfiegppQmWwShvhDHdoExcCW55VM2Jp0ayn8Tf9f5MW6D4i
zQ04JiryPJknC5q17DaIEbKZQhB5ySlHxwP3f8Ca/3BHj94bETONF9JhMa6TtV8z
4fXXndHNqB0hBK1iW6Y1SXL3v+PrdZJj07sjo81uDThThH2auT/9qhEocE3385dH
deo7OghAUNxuEh3LfeBDvaaHTOzIxIJvYEhQab8ReeKrSCTJk/nPG888YENsVG8e
OQEyUZ9w2aBMmaNtxh1VKJY92rgtABfFpydblgs2ITfK/9tJ6nI=
=LSaY
-----END PGP SIGNATURE-----
Filters v3.2.0
⚠️ Backwards-Incompatible Changes
FilterMapper
no longer returnsOrderedDict
values; since Python 3.6dict
maintains key insertion order.-
If your code relies on the previous behaviour, you can restore it by subclassing
FilterMapper
, like this:class CustomFilterMapper(f.FilterMapper): mapping_result_type = OrderedDict
-
Split
no longer returnsOrderedDict
values whenkeys
are provided (same reason as forFilterMapper
).- There is no workaround for this, but if your code does rely on the previous behaviour, please post an issue in the issue tracker (or better yet, post a PR 😇).
- Officially I'm no longer supporting Python 3.6, but it would be a super simple fix to make the return type override-able the same as
FilterMapper
.
Choice
is now located infilters.string
instead offilters.simple
. However, it is still accessible under the top-levelfilters
namespace (i.e.,filters.Choice
still works as expected).- If your code references
filters.simple.Choice
, you'll need to update the references tofilters.string.Choice
or (better)filters.Choice
. - Despite the semantic change, you can still use
Choice
with any hashable types (e.g.,Choice([1, 2, 3])
is still valid).
- If your code references
- Many filters that were previously checking for
str
type now check fortyping.Text
(introduced in Python 3.5.2).
Other Changes
-
[#25] Added
case_sensitive
parameter toChoice
.- Defaults to
True
, to preserve backwards-compatibility.
- Defaults to
-
[#13] Added
Item
filter. -
[#10] Added
Omit
filter. -
[#9 ] Added
Pick
filter. -
[#11] Added
FilterRunner.apply()
-
Fixed incorrect string representation for
Choice
. -
Test methods
assertFilterPasses()
andassertFilterErrors
now return the correspondingFilterRunner
instance.Previously you would have to do this in your tests:
def test_something(self): runner = self._filter(...) self.assertFilterPasses(runner, ...) self.assertSomething(runner.cleaned_data, ...)
In this version, you can now simplify the code a bit:
def test_something(self): runner = self.assertFilterPasses(self._filter(...), ...) self.assertSomething(runner.cleaned_data, ...)
-
Fixed documentation entry for
Round
; it is now in the correct place and has a proper heading. -
Added lots of cross-links within the documentation.
-
General code cleanup.
Sha256 Hashes
1d7611f5d855172f1a8bbad5bf30aee45e929c40dc45bc769bf33d0e945042fe phx-filters-3.2.0.tar.gz
457528dc09f4214a19f6c11e87033f31463f50fb5109976bd28ac00a388effdc phx_filters-3.2.0-py3-none-any.whl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
# ⚠️ Backwards-Incompatible Changes
* `FilterMapper` no longer returns `OrderedDict` values; since Python 3.6 `dict` maintains key insertion order.
* If your code relies on the previous behaviour, you can restore it by subclassing `FilterMapper`, like this:
```python
class CustomFilterMapper(f.FilterMapper):
mapping_result_type = OrderedDict
```
* `Split` no longer returns `OrderedDict` values when `keys` are provided (same reason as for `FilterMapper`).
* There is no workaround for this, but if your code does rely on the previous behaviour, please post an issue in the issue tracker (or better yet, post a PR 😇).
* Officially I'm no longer supporting Python 3.6, but it would be a super simple fix to make the return type override-able the same as `FilterMapper`.
* `Choice` is now located in `filters.string` instead of `filters.simple`. However, it is still accessible under the top-level `filters` namespace (i.e., `filters.Choice` still works as expected).
* If your code references `filters.simple.Choice`, you'll need to update the references to `filters.string.Choice` or (better) `filters.Choice`.
* Despite the semantic change, you can still use `Choice` with any hashable types (e.g., `Choice([1, 2, 3])` is still valid).
* Many filters that were previously checking for `str` type now check for `typing.Text` (introduced in Python 3.5.2).
# Other Changes
* [#25] Added `case_sensitive` parameter to `Choice`.
* Defaults to `True`, to preserve backwards-compatibility.
* [#13] Added `Item` filter.
* [#10] Added `Omit` filter.
* [#9 ] Added `Pick` filter.
* [#11] Added `FilterRunner.apply()`
* Fixed incorrect string representation for `Choice`.
* Test methods `assertFilterPasses()` and `assertFilterErrors` now return the corresponding `FilterRunner` instance.
Previously you would have to do this in your tests:
```python
def test_something(self):
runner = self._filter(...)
self.assertFilterPasses(runner, ...)
self.assertSomething(runner.cleaned_data, ...)
```
In this version, you can now simplify the code a bit:
```python
def test_something(self):
runner = self.assertFilterPasses(self._filter(...), ...)
self.assertSomething(runner.cleaned_data, ...)
```
* Fixed documentation entry for `Round`; it is now in the correct place and has a proper heading.
* Added lots of cross-links within the documentation.
* General code cleanup.
# Sha256 Hashes
* `1d7611f5d855172f1a8bbad5bf30aee45e929c40dc45bc769bf33d0e945042fe phx-filters-3.2.0.tar.gz`
* `457528dc09f4214a19f6c11e87033f31463f50fb5109976bd28ac00a388effdc phx_filters-3.2.0-py3-none-any.whl`
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEnIUO0KsYbEbt5eQY330i9k++dSEFAmPgh44ACgkQ330i9k++
dSFo+g/6Aq/JyOTRhD+b/t3bu0GN/bfviPO/zQNmLO8YzyH8MpaBJDX8arzjj+A+
936lOUAftlhoFcvt37MACBBQveh2vtFHhV05NV8wgGXZleD9RjCHk2JJxb9RTFDo
9gi9IwR9U5aB2Cr7ysP9IKKqqFCmivp3xvTX/Kxskl89UM20iE9e9SR9Ip6821xG
iep56ZKPDKMqA/GrLOweSHGqHoo2TzHCfH9KqaZ5nuzTjFY8rEPYJxFPqJmWesRw
SmPliu5qs3iF7B1Lz7Ad2N0OYzylkuCbUgp+IukcesEEQe2/PJGsF31jUwxrYfuA
EApfDTfInsiQ1qSzr8sMhGWousbU3ewfbYFCe95m7ioWoy9CQkO13TK4aKlPGRxl
7hROo3fgpU1ehG5Ig9EHJNJM2Dcnt4aY+5nAUDLhZDBer9QPC622fsWbrAYV5qbj
nccDPMKVazU3CgcfzBG1HsQvN+RYSPQFwtiny0nUbS7Qw29iTZJNIYQT3vMlGXJ5
eaYGMQOZanOkumnX3+5HprgsZRArJNWEG/VtEbkB6IEkB+FOfHFZILRP6kbnk7tl
8I8rG8PqAKd3aynkeBjsO7hjVkV0PTGKgiNL6DJ4+sDi/Bzi2Ce6Dqhj6quXi2du
R7BcZVM+oIpZfzU+OUb/iAnTRvAU+VARXOOhRMYtTBPFWhTnCco=
=7bkT
-----END PGP SIGNATURE-----
Filters v3.1.0
Breaking Changes
MaxBytes
truncate
now defaults toFalse
(previously defaulted toTrue
).- When
truncate=True
, values that get truncated are considered valid (previously, any value that was too long would be treated as invalid, regardless of whether it got truncated).
Example:
import filters as f
# In v3.1.0, truncated values are considered valid.
runner = f.FilterRunner(f.MaxBytes(22, truncate=True), 'हैलो वर्ल्ड')
assert runner.is_valid() is True # In previous versions, this would be ``False``
assert runner.cleaned_data ==\
b'\xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\xb2\xe0' \
b'\xa5\x8b \xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d'
# When `truncate=False`, the behaviour is the same as previous versions.
runner = f.FilterRunner(f.MaxBytes(22, truncate=False), 'हैलो वर्ल्ड')
assert runner.is_valid() is False
assert runner.cleaned_data is None
Other Changes
MaxBytes
- [#8] Added support for
suffix
, which applies a suffix to truncated values. MaxBytes.truncate_bytes()
(previouslytruncate_string
) can now be used independently from a filter chain:
import filters as f
truncated = f.MaxBytes(12, suffix='...').truncate_bytes(b'Hello, world!')
assert truncated == b'Hello, wo...'
Misc
- Fixed broken Tox configuration — it now ACTUALLY runs the unit tests 😅
- Fixed an issue preventing test files from getting included in sdist.
- Renamed test files to match default unittest discovery pattern.
- Fixed a couple of typos in the documentation.
SHA256 Checksums
936a1203c20f805cec024edb150ad8956cf24ed492232390132889a75ddf3d1d phx-filters-3.1.0.tar.gz
ca6e14a09789d806ee49ee3cfcbdd2e0f1b9a24fcb72bce8e3716744323745fb phx_filters-3.1.0-py3-none-any.whl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
# Breaking Changes
## MaxBytes
* `truncate` now defaults to `False` (previously defaulted to `True`).
* When `truncate=True`, values that get truncated are considered valid (previously, any value that was too long would be treated as invalid, regardless of whether it got truncated).
Example:
```python
import filters as f
# In v3.1.0, truncated values are considered valid.
runner = f.FilterRunner(f.MaxBytes(22, truncate=True), 'हैलो वर्ल्ड')
assert runner.is_valid() is True # In previous versions, this would be ``False``
assert runner.cleaned_data ==\
b'\xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\xb2\xe0' \
b'\xa5\x8b \xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d'
# When `truncate=False`, the behaviour is the same as previous versions.
runner = f.FilterRunner(f.MaxBytes(22, truncate=False), 'हैलो वर्ल्ड')
assert runner.is_valid() is False
assert runner.cleaned_data is None
```
# Other Changes
## MaxBytes
* [#8] Added support for `suffix`, which applies a suffix to truncated values.
* `MaxBytes.truncate_bytes()` (previously `truncate_string`) can now be used independently from a filter chain:
```python
import filters as f
truncated = f.MaxBytes(12, suffix='...').truncate_bytes(b'Hello, world!')
assert truncated == b'Hello, wo...'
```
## Misc
* Fixed broken Tox configuration — it now ACTUALLY runs the unit tests 😅
* Fixed an issue preventing test files from getting included in sdist.
* Renamed test files to match default unittest discovery pattern.
* Fixed a couple of typos in the documentation.
# SHA256 Checksums
* `936a1203c20f805cec024edb150ad8956cf24ed492232390132889a75ddf3d1d phx-filters-3.1.0.tar.gz`
* `ca6e14a09789d806ee49ee3cfcbdd2e0f1b9a24fcb72bce8e3716744323745fb phx_filters-3.1.0-py3-none-any.whl`
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEnIUO0KsYbEbt5eQY330i9k++dSEFAmPcXuwACgkQ330i9k++
dSE+UA//RgoFliQWKOAl8p7NQhQP8iuFycNVR8SD6zUxnj4AaVhZW/ErRijnI4cf
B3Ajdy+Ir/HGuqaXVvoc77nyBae8Q3CumrWhfZhjG1Gi2EcHKctlmzSYUZ2IXXQN
oDX0iNi6/LSw8NGAz7D4Aad/IKnmd/CXNLZsac/u9aaPtQgTXXz3gyKhuXmqR7gi
vrHsgOxrd8gNGwTbuIiIYj+aDk/S9jFbaYGKK/e6HcY/5CuweD9wGWYLOIcXPATN
Vo40qYyKT4kHyqn50ugq8sDcvBY5CP9LeKa8aM3m7WT77JjDHy1QKBTJLkZBdifG
VLcyz1hLEjjwMrp2kfDxy8emjnxvwpHG0X9+aDKHNDXBS+O9si2QdELwBF6sS14x
ZkV431AojAn0EDO4oPXJxywOle161HyjsqqxaDIhN3r4vhNkY2TDqcAynO17jTJ2
VPVdiimD2eXdrUSkuhxPMIcZKoKqtssmNznkucwY4zXN+2D2pnGUgOhHBxB3OWSE
CKgmbiccMiBlnqsJag8qb6tOwgBXxZhNpBr5Icyr9Nkhlq780NI/qV4MDAkk82Ff
R3uBT+/6RZ9ys4b0YzKkkIwoP3n3QYJVa53QxSEGXhT8AMvCXEkHGYmhJtCvVcy8
u0pg0uJ8gaH+CB7Sgo/ApNSLKfi2vO8SLQ3xDv86oJ6yaCtfXg4=
=HAX+
-----END PGP SIGNATURE-----
Filters v3.0.1
Changelog
- Switched official support to Python 3.11, 3.10, and 3.9 (but older versions are supported unofficially).
- Added
filter_macro
andFilterMacroType
to the top-levelfilters
namespace. - Refactored some Python 2 type hinting syntax that sneaked past previous revisions.
- Complete overhaul of the documentation:
- It's now much easier to navigate and link to individual filters.
- Added examples for every single filter.
- Fixed some issues with the example code in Writing Your Own Filters.
- Translate documentation to NZ English 🇳🇿
- Added release instructions to README.
SHA256 Hashes
4898eab2a22f79a44bd7cab4d6ffe57333cfc1762474034dcc54dcadc2b99780 phx-filters-3.0.1.tar.gz
3d77b2d2f8e601c6b94ac96cb4d87330637866515bea0c196cf62883ddbcb196 phx_filters-3.0.1-py3-none-any.whl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
# Changelog
* Switched official support to Python 3.11, 3.10, and 3.9 (but older versions are supported unofficially).
* Added `filter_macro` and `FilterMacroType` to the top-level `filters` namespace.
* Refactored some Python 2 type hinting syntax that sneaked past previous revisions.
* Complete overhaul of the documentation:
* It's now much easier to navigate and link to individual filters.
* Added examples for every single filter.
* Fixed some issues with the example code in Writing Your Own Filters.
* Translate documentation to NZ English 🇳🇿
* Added release instructions to README.
# SHA256 Hashes
* `4898eab2a22f79a44bd7cab4d6ffe57333cfc1762474034dcc54dcadc2b99780 phx-filters-3.0.1.tar.gz`
* `3d77b2d2f8e601c6b94ac96cb4d87330637866515bea0c196cf62883ddbcb196 phx_filters-3.0.1-py3-none-any.whl`
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEnIUO0KsYbEbt5eQY330i9k++dSEFAmPTOfMACgkQ330i9k++
dSE7xg//b5VMH2/1y47zxzs7ASRZ2M9QFRAQyobFESGvhSMJeFSSlZA8+pg+m1V+
cd0GJTXJKW5eijElw9Y7KOQP/ZvjsOZFSbd/CS3+W6W5u7JByOb2Y1ek+EB986ZE
U3wY3PvFI5khMGCdd565Ajbv1d+oNfIgF2mgkgSBzhwy8KR+c3y1OyfJstQtmXP7
BITACexvPwUTyvYaI/9NF2T3hDlgF7MbJ8bQMnNqGfcGi3c5bEwYXAAie9l3FKLb
zj+P5II//zbWws7rMsPUMy2jityRVl8iZMA49ISPxhQqdJWWYPkYDwFZkCpotJ/t
K/g4QWEH0Uq+IhOvXQ4vD2o6OdIrgz0InhtyplpgrAfXforYcMwTPgQyW3jwpZCs
xeYjBXRuwUeDfN/0j8THZ8vgo/FCDvJNFr2cYcMwgS9WC5BQoy6IsA00Oy63NAtR
rphzRTZoMZZaUZXJX7v1nuB58/dwiEe3viF9RdH8hkj+XxbERvFQUmaqKW6xIrGz
s4WNgrxpGcf5vWgXN6URoy17tDDeL3LmBIqzPOsdBIsAzhRQLzk5QCnWB470HznU
W6jrtEsNoMe1vzroW5gy+UNOMLHhWZKzydYJdSYYPA4Hg5DGvSaKU4+ysw88tltq
1fb4A4K1rwHcUnfxMt+5yG9eqUfcvi0I/wXcmGRIylyzs8/rvwo=
=2AEf
-----END PGP SIGNATURE-----
Filters v2.0.2
- Fix links for installing extra packages (e.g.,
pip install phx-filters[django,iso]
).
Filters v2.0.1
Filters v2.0.0
- Dropped support for Python 2.
- Added support for Python 3.7 and 3.8.
- Adopted PEP-8.
- Renamed fork to
phx-filters
.