๐Ÿ“ฆ wnowicki / bitaware

Bitwise Configuration Support

โ˜… 2 stars โ‘‚ 0 forks ๐Ÿ‘ 2 watching โš–๏ธ MIT License
๐Ÿ“ฅ Clone https://github.com/wnowicki/bitaware.git
HTTPS git clone https://github.com/wnowicki/bitaware.git
SSH git clone git@github.com:wnowicki/bitaware.git
CLI gh repo clone wnowicki/bitaware
Wojtek Wojtek Merge pull request #4 from wnowicki/issue-3 c110212 7 months ago ๐Ÿ“ History
๐Ÿ“‚ main View all commits โ†’
๐Ÿ“ .github
๐Ÿ“ .vscode
๐Ÿ“ src
๐Ÿ“ tests
๐Ÿ“„ .editorconfig
๐Ÿ“„ .env.example
๐Ÿ“„ .gitignore
๐Ÿ“„ .markdown.yml
๐Ÿ“„ .pylintrc
๐Ÿ“„ .python-version
๐Ÿ“„ CHANGELOG.md
๐Ÿ“„ LICENSE.md
๐Ÿ“„ pyproject.toml
๐Ÿ“„ README.md
๐Ÿ“„ uv.lock
๐Ÿ“„ README.md

BitAware

Bitwise Toolbox

python ruff pytest markdown License: GPLv3

Usage

Define

from bitaware import BitFlag, BitAware

class PermissionTypes(BitFlag):
    READ = 1
    CREATE = 2
    EDIT = 4
    ADMIN = 8


class UserPermission(BitAware[PermissionTypes]):
    def __init__(self, value: int):
        super().__init__(value, PermissionTypes)

    pass

    # "User Roles" Named sets can be used interchangeably
    READER = PermissionTypes.READ
    CREATOR = PermissionTypes.CREATE | PermissionTypes.READ
    EDITOR = PermissionTypes.EDIT | PermissionTypes.READ

Simple Use

Standalone:

permission = UserPermission(PermissionTypes.ADMIN | PermissionTypes.READ)

print(permission.has(PermissionTypes.ADMIN))  # True
print(permission.has(PermissionTypes.CREATE))  # False

Pydantic

As Pydantic field:

class User(BaseModel):
    name: str
    permissions: UserPermission

Usage

user = User(name="test_user", permissions=UserPermission.READER)
admin = User(name="admin_user", permissions=PermissionTypes.READ | PermissionTypes.ADMIN)

print(user.model_dump_json(indent=2))

Above code will print:

{
  "name": "test_user",
  "permissions": 1
}

Misc

x = UserPermission(12)

print(str(x)) # EDIT|ADMIN [EDIT, ADMIN]
print(repr(x)) # UserPermission(PermissionTypes.EDIT | PermissionTypes.ADMIN)
print(list(x)) # [<PermissionTypes.EDIT: 4>, <PermissionTypes.ADMIN: 8>]

For predefined named flag set:

x = UserPermission(UserPermission.CREATOR)

print(str(x)) # CREATOR [READ, CREATE]
print(repr(x)) # UserPermission(PermissionTypes.READ | PermissionTypes.CREATE)
print(list(x)) # [<PermissionTypes.READ: 1>, <PermissionTypes.CREATE: 2>]

Predefined named flag sets:

print(UserPermission.properties()) # {<PermissionTypes.READ|CREATE: 3>: 'CREATOR', <PermissionTypes.READ|EDIT: 5>: 'EDITOR', <PermissionTypes.READ: 1>: 'READER'}

Test

uv run pytest

Security

If you discover any security-related issues, please email email instead of using the issue tracker.


Copyright (c) 2025 Wojciech Nowicki