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.4.0.tar.gz (86.8 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.4.0-py3-none-any.whl (115.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: stapel_attributes-0.4.0.tar.gz
  • Upload date:
  • Size: 86.8 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.4.0.tar.gz
Algorithm Hash digest
SHA256 753319a48f677d595cc9c34d3f23c8f43b2a940f249fa7a089e151664d67ccbf
MD5 49414b353383da15bf621e12617f1b0a
BLAKE2b-256 6da1b55bc37e90580dc6b65deb05200bc0816eace0db1562d67a1fc7f809b0dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_attributes-0.4.0.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.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for stapel_attributes-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3f122a968b3c0e782ea859b191c0f5c831106d6bab0e46206a5c2ab6913ad319
MD5 98b5cfa17e2b5f6b3322ffc732c95256
BLAKE2b-256 178d39e401ae61c58b8b2335de4de445a0bb6d775b43bb33cee5c116a978c34f

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_attributes-0.4.0-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

This release

0.4.0 This release

2 files

0.3.4

2 files

0.3.3

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