0.4.0: release notes

This commit is contained in:
Yusur 2025-07-22 02:28:44 +02:00
parent 3188b59c15
commit 7da8d2ceb7
6 changed files with 33 additions and 21 deletions

View file

@ -2,14 +2,19 @@
## 0.4.0 ## 0.4.0
+ Added `ValueProperty`, abstract superclass for `ConfigProperty` + `pydantic` is now a hard dependency
+ \[BREAKING] Changed the behavior of `makelist()`: now it's also a decorator, converting its return type to a list (revertable with `wrap=False`) + `ConfigProperty` has now been generalized: check out `classtools.ValueProperty`
+ New module `lex` with functions `symbol_table()` and `lex()` — make tokenization more affordable + **BREAKING**: Changed the behavior of `makelist()`: **different behavior when used with callables**.
+ Add `dorks` module and `flask.harden()` * When applied as a decorator on callable, it converts its return type to a list.
* Pass `wrap=False` to treat callables as simple objects, restoring the 0.3 behavior.
+ New module `lex` to make tokenization more affordable — with functions `symbol_table()` and `lex()`
+ Add `dorks` module and `flask.harden()`. `dorks` contains common endpoints which may be target by hackers
+ Add `sqlalchemy.bool_column()`: make making flags painless + Add `sqlalchemy.bool_column()`: make making flags painless
+ Introduce `rb64encode()` and `rb64decode()` to deal with issues about Base64 and padding + Introduce `rb64encode()` and `rb64decode()` to deal with issues about Base64 and padding
* `b64encode()` and `b64decode()` pad to the right
* `rb64encode()` and `rb64decode()` pad to the left, then strip leading `'A'` in output
+ Added `addattr()`, `PrefixIdentifier()`, `mod_floor()`, `mod_ceil()` + Added `addattr()`, `PrefixIdentifier()`, `mod_floor()`, `mod_ceil()`
+ First version to have unit tests! + First version to have unit tests! (Coverage is not yet complete)
## 0.3.7 ## 0.3.7

View file

@ -1,8 +1,12 @@
# SIS Unified Object Underarmor # SIS Unified Object Underarmor
Good morning, my brother! Welcome the SUOU (SIS Unified Object Underarmor), a library for the management of the storage of objects into a database. Good morning, my brother! Welcome the SUOU (SIS Unified Object Underarmor), an utility library for developing API's, database schemas and stuff in Python.
It provides utilities such as [SIQ](https://yusur.moe/protocols/siq.html), signing and generation of access tokens (on top of [ItsDangerous](https://github.com/pallets/itsdangerous)) and various utilities, including helpers for use in Flask and SQLAlchemy. It provides utilities such as:
* [SIQ](https://yusur.moe/protocols/siq.html)
* signing and generation of access tokens, on top of [ItsDangerous](https://github.com/pallets/itsdangerous)
* helpers for use in Flask and SQLAlchemy
* ...
**It is not an ORM** nor a replacement of it; it works along existing ORMs (currently only SQLAlchemy is supported lol). **It is not an ORM** nor a replacement of it; it works along existing ORMs (currently only SQLAlchemy is supported lol).

View file

@ -27,13 +27,14 @@ from .itertools import makelist, kwargs_prefix, ltuple, rtuple, additem
from .i18n import I18n, JsonI18n, TomlI18n from .i18n import I18n, JsonI18n, TomlI18n
from .snowflake import Snowflake, SnowflakeGen from .snowflake import Snowflake, SnowflakeGen
from .lex import symbol_table, lex, ilex from .lex import symbol_table, lex, ilex
from .strtools import PrefixIdentifier
__version__ = "0.4.0-dev28" __version__ = "0.4.0"
__all__ = ( __all__ = (
'ConfigOptions', 'ConfigParserConfigSource', 'ConfigSource', 'ConfigValue', 'ConfigOptions', 'ConfigParserConfigSource', 'ConfigSource', 'ConfigValue',
'DictConfigSource', 'EnvConfigSource', 'I18n', 'Incomplete', 'JsonI18n', 'DictConfigSource', 'EnvConfigSource', 'I18n', 'Incomplete', 'JsonI18n',
'MissingConfigError', 'MissingConfigWarning', 'Siq', 'SiqCache', 'SiqGen', 'MissingConfigError', 'MissingConfigWarning', 'PrefixIdentifier', 'Siq', 'SiqCache', 'SiqGen',
'SiqType', 'Snowflake', 'SnowflakeGen', 'StringCase', 'TomlI18n', 'Wanted', 'SiqType', 'Snowflake', 'SnowflakeGen', 'StringCase', 'TomlI18n', 'Wanted',
'additem', 'b2048decode', 'b2048encode', 'b32ldecode', 'b32lencode', 'additem', 'b2048decode', 'b2048encode', 'b32ldecode', 'b32lencode',
'b64encode', 'b64decode', 'cb32encode', 'cb32decode', 'count_ones', 'b64encode', 'b64decode', 'cb32encode', 'cb32decode', 'count_ones',

View file

@ -24,5 +24,19 @@ SENSITIVE_ENDPOINTS = """
/package.json /package.json
/package-lock.json /package-lock.json
/composer. /composer.
/docker-compose.
/config/
/config.
/secrets.
/credentials.
/.idea/
/.vscode/
/storage/
/logs/
/.DS_Store
/backup
/.backup
/db.sql
/database.sql
""".split() """.split()

View file

@ -1,8 +0,0 @@
"""
Form validation, done right.
Why this? Why not, let's say, WTForms or Marshmallow? Well, I have my reasons.
TODO
"""

View file

@ -17,10 +17,6 @@ class TestCodecs(unittest.TestCase):
def tearDown(self) -> None: def tearDown(self) -> None:
... ...
#def runTest(self):
# self.test_b64encode()
# self.test_b64decode()
def test_b64encode(self): def test_b64encode(self):
self.assertEqual(b64encode(B1), 'TvC0w4UK-baaD4KmmUcHIw') self.assertEqual(b64encode(B1), 'TvC0w4UK-baaD4KmmUcHIw')
self.assertEqual(b64encode(B2), 'vFhpRixAfHu-4wx6qMtRgg') self.assertEqual(b64encode(B2), 'vFhpRixAfHu-4wx6qMtRgg')