Skip to main content

stapel-attributes

CI codecov PyPI

Typed attributes engine for the Stapel framework — a polymorphic type system for attribute ("feature") configurations: an open registry of feature types, Config/DTO/DAO layering per type, polymorphic DRF serializers with OpenAPI schemas, and a structured value-validation pipeline.

This is an L1 library, not a module: it ships no models, migrations, views, urls or comm surface. Both stapel-categories (attribute schema) and stapel-listings (attribute values) import it — the code both need synchronously lives one layer down, like stapel-core itself.

Provenance: port of the categories/feature_types engine and the ads validation pipeline from a legacy catalog app (see CHANGELOG for what was fixed in transit).

Install

pip install stapel-attributes

No INSTALLED_APPS entry, no urls — just import it:

from stapel_attributes import (
    FeatureDef,
    validate_dto,
    normalize_to_dao,
    validate_dto_structured,
)

configs = [
    FeatureDef(slug="mileage", config={"type": "int", "min": 0, "postfix": "km"}),
    FeatureDef(slug="condition", config={"type": "bool"}, mandatory=True),
]
payload = {"mileage": {"type": "int", "value": 120000},
           "condition": {"type": "bool", "value": True}}

validate_dto(configs, payload)              # raises ValidationError on failure
dao = normalize_to_dao(configs, payload)    # {"mileage": {"type": "int", "value": 120000, "postfix": "km", "order": 0}, ...}
result = validate_dto_structured(configs, payload)  # machine-readable batch result

Built-in types

int, float, string, bool, hex_color, select, date, header, hierarchical_select. Each type is a plugin: a Config dataclass (schema), a DTO (client input), a DAO (stored value + display metadata) and a handler (BaseFeatureType[TConfig, TDto, TDao]).

Marketplace-specific types (size grids, convertible units, ...) are not shipped — hosts register their own via the open registry (see MODULE.md for the worked example).

Settings

All configuration lives in the STAPEL_ATTRIBUTES namespace (dict setting, flat setting, or env var — resolved lazily):

Key Default Meaning
EXTRA_TYPES [] Dotted paths of extra feature types, merged over the built-ins (each entry: a BaseFeatureType subclass or a module that registers types on import).

Structured validation

Every validation failure carries a machine code end-to-end (ValidationErrorCode) via FeatureValidationError — no message parsing. Batch validators return ValidationBatchResult rows with error, ref_value, localizable_error (an error.400.feature_* key) and params.

Extension points

See MODULE.md — the agent-facing map of every fork-free seam (settings, the type registry, serializer factories, translation-key hooks).

Admin UI

A schema-driven config editor (Lit 3 web components) ships with the package. Each type declares its admin form in Python (config_form() → field-kinds); the committed bundle renders it, so a new type needs zero JS for standard kinds. Use ConfigEditorWidget on a config JSONField:

from stapel_attributes import ConfigEditorWidget

class FeatureForm(forms.ModelForm):
    class Meta:
        widgets = {"config": ConfigEditorWidget()}

Two themes (--stapel-*, light + dark), en/ru locales (merge without fork via ADMIN_LOCALES), and JS widget registries for exotic types. See MODULE.md "Admin UI" and docs/done/attributes-admin-ui.md. Frontend source is in static_src/ (npm test / npm run build); the built bundle is committed — consumers need no Node.

Development

pip install -e . && pip install pytest pytest-django ruff
./setup-hooks.sh
pytest tests/

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stapel_attributes-0.3.3.tar.gz (87.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stapel_attributes-0.3.3-py3-none-any.whl (116.6 kB view details)

Uploaded Python 3

File details

Details for the file stapel_attributes-0.3.3.tar.gz.

File metadata

  • Download URL: stapel_attributes-0.3.3.tar.gz
  • Upload date:
  • Size: 87.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stapel_attributes-0.3.3.tar.gz
Algorithm Hash digest
SHA256 0e8d5884726be1d296af335b3956fc355caf509718df6f5b2cf4cab3e13dcb87
MD5 e731823e62cc3cdd333f6b1742cd3581
BLAKE2b-256 9734b9e9d908bdb7abff0d6819da46c83f32895ff5031a372543c4ad1d9302e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_attributes-0.3.3.tar.gz:

Publisher: publish.yml on usestapel/stapel-attributes

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stapel_attributes-0.3.3-py3-none-any.whl.

File metadata

File hashes

Hashes for stapel_attributes-0.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 685e54a3e250be91e8cbed59dd8f61c8714489829bae5fed548e54fbee60df50
MD5 233637e25ed285badcdcdae686353f65
BLAKE2b-256 ec9f25a78612aaacda0631cebe5ceb7fbde4771bc029a6f24dd7db295a8704e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_attributes-0.3.3-py3-none-any.whl:

Publisher: publish.yml on usestapel/stapel-attributes

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.4.7

2 files

0.4.6

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.4

2 files

This release

0.3.3 This release

2 files

0.3.2

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page