mandel/testing/: ocyan-plugin-coyote-0.3.1 metadata and description

Homepage Simple index Newer version available

Wagtail page, block, and styling plugin for Ocyan themes.

author Mandel
author_email [email protected]
classifiers
  • License :: Other/Proprietary License
  • Framework :: Ocyan
  • Environment :: Plugins
description_content_type text/markdown
dynamic
  • author
  • author-email
  • classifier
  • description
  • description-content-type
  • home-page
  • provides-extra
  • requires-dist
  • requires-python
  • summary
provides_extras
  • test
requires_dist
  • ocyan.core
  • wagtail-roadrunner
  • oxyan.themes
  • empty_testproject; extra == "test"
  • ocyan.plugin.testing; extra == "test"
  • pylint-django; extra == "test"
  • ruff; extra == "test"
  • vdt.versionplugin.wheel; extra == "test"
  • coverage; extra == "test"
requires_python >=3.6
File Tox results History
ocyan_plugin_coyote-0.3.1-py3-none-any.whl
Size
689 KB
Type
Python Wheel
Python
3
ocyan_plugin_coyote-0.3.1.tar.gz
Size
619 KB
Type
Source

MandelBlogStack / Ocyan Coyote

Coyote is a Wagtail-first content and styling plugin for the MandelBlogStack / Ocyan ecosystem. It provides:

It is best understood as a presentation/content system plugin, not a standalone application.

What Coyote owns

Coyote contributes the following pieces to a host project:

How it fits into MandelBlogStack

Coyote sits on top of the wider Ocyan stack. It is not intended to run in isolation.

Required dependencies


- ``Wagtail`` for pages, blocks, admin, and site settings
- ``ocyan.plugin.wagtail`` for current-request middleware, localization
  helpers, and the shared ``AbstractBasePage`` model
- ``oxyan.themes`` for theme defaults and theme extension support
- ``wagtail-roadrunner`` for shared tags and layout assumptions

Current optional / host-specific assumptions

These are not cleanly decoupled yet and should be treated as integration assumptions of the current stack:

Current hardening status:

If those integrations are missing, Coyote now degrades more safely, but the affected blocks still provide their best experience inside the full MandelBlogStack.

Theme integration

The plugin registers a front extension into:

The extension currently injects optional font imports into the base theme template. Coyote does not own the full outer page shell; it extends the active theme/layout system.

Assets and runtime ownership

Current asset layout is mixed:

Current source-of-truth notes:

Public CSS contract


Coyote now ships compiled public CSS fallback/default assets under stable
plugin static paths:

- ``static/coyote/css/base.css``
- ``static/coyote/css/homepage/base.css``
- ``static/coyote/css/contact/base.css``

Those compiled files are the default runtime assets loaded by:

- ``templates/coyote/partials/styles/base_styles.html``
- ``templates/coyote/partials/styles/home_styles.html``
- ``templates/coyote/partials/styles/contact_styles.html``

SCSS source-of-truth

SCSS remains the source of truth for public styling:

Those entrypoints depend on the MandelBlogStack theme Sass function layer from oxyan.themes and are compiled against the active theme definitions.

Host override / rebuild contract


The host stack may intentionally override or rebuild the shipped public CSS,
but that is now an explicit choice rather than an implicit runtime dependency.

Safe host options:

- override the Coyote stylesheet partial templates in the host project
- rebuild the compiled CSS files from the same SCSS entrypoints using the
  existing ``django-libsass`` + ``oxyan.themes`` Sass function path
- replace the shipped CSS with host-specific compiled equivalents while keeping
  the SCSS entrypoints source-controlled in this plugin

The plugin does not introduce a second build system for this. The verified
compile path remains the MandelBlogStack Django/libsass stack already used for
theme-aware Sass functions.

Public asset ownership
~~~~~~~~~~~~~~~~~~~~~~

Coyote owns these public SCSS entrypoints:

- ``static/coyote/base.scss``
- ``static/coyote/homepage/base.scss``
- ``static/coyote/contact/base.scss``

and now also ships verified compiled fallback/default assets under:

- ``static/coyote/css/base.css``
- ``static/coyote/css/homepage/base.css``
- ``static/coyote/css/contact/base.css``

That removes the legacy runtime requirement to serve public ``text/x-scss``
directly while still preserving SCSS as the editable source.

Packaging notes
---------------

- package name: ``ocyan.plugin.coyote``
- AppConfig label: ``coyote``
- includes templates/static files through ``include_package_data=True`` and
  ``graft ocyan`` in ``MANIFEST.in``

Current limitations
-------------------

- tightly coupled to parts of the MandelBlogStack host project
- minimal automated coverage outside Google Fonts utility behavior
- repo historically accumulated local build/runtime junk; Phase 1 hardening
  keeps that out of Git going forward
- migrations include state-sensitive custom logic and are intentionally left
  untouched in this phase
- migrations ``0024`` and ``0025`` form a coupled database/state transition for
  the ``AbstractBasePage`` inheritance switch; they should be treated as a
  reviewed chain and not rewritten casually
- several older migrations still import live ``oxyan.themes.definitions.theme``
  defaults; this remains a legacy risk and must not be copied into any future
  migration pattern
- editor-facing copy is still partly Dutch and not fully neutral for all client
  deployments in migration-sensitive StreamField definitions and legacy
  migrations, which were intentionally left unchanged in this phase
- some templates still need accessibility hardening in future phases

Migration and compatibility notes
---------------------------------

Migration caveats
~~~~~~~~~~~~~~~~~

- ``0024_remove_coyotecontactpage_page_ptr_and_more`` performs conditional
  database operations, including a SQLite-specific table rebuild path.
- ``0025_remove_coyotecontactpage_page_ptr_and_more`` carries the matching
  state-only changes through ``SeparateDatabaseAndState``.
- Those migrations should stay paired in the history. If page inheritance needs
  further changes later, add a new migration rather than editing either file.
- Historical migrations from ``0010`` through ``0021`` include imports from
  ``oxyan.themes.definitions.theme``. They are preserved for compatibility, but
  future migrations should freeze defaults directly in the migration file
  instead of importing live theme definitions.

Migration policy
~~~~~~~~~~~~~~~~

Historical migrations are treated as immutable unless there is a very strong,
reviewed reason to intervene. In practice that means:

- do not rewrite the existing ``0010`` / ``0014`` / ``0017`` / ``0018`` /
  ``0019`` / ``0020`` / ``0021`` legacy migration files
- do not edit ``0024`` or ``0025`` casually; they are a coupled historical
  database/state transition and must be treated as a reviewed pair
- do not add any new migration that imports live runtime values from
  ``oxyan.themes.definitions.theme``
- for future migrations, freeze literal defaults directly into the migration
  file instead of importing them from runtime modules
- if future schema or data changes need theme-derived values, resolve and
  freeze them at migration creation time rather than at migration execution

This policy is intentionally conservative: freeze the future without rewriting
the past.

Current compatibility hardening
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- Coyote-owned telepath/widget adapter imports now use the current Wagtail
  admin import paths.
- Optional integrations with Oscar, ``contact_form``, and Roadrunner still
  assume the full MandelBlogStack for best results, but missing pieces degrade
  more safely than before.
- Remaining Wagtail deprecation warnings currently come from external stack
  components such as ``wagtail-roadrunner``, not from the Coyote-owned adapter
  path updated here.

Recommended checks
------------------

Focused plugin checks used during hardening:

.. code-block:: bash

   git diff --check
   ruff check .
   black --check .
   /Users/motolaniolaiya/kitchensink/bin/manage check
   /Users/motolaniolaiya/kitchensink/bin/manage makemigrations --check --dry-run coyote

For smoke tests:

.. code-block:: bash

   DJANGO_SETTINGS_MODULE=ocyan.plugin.coyote.test_settings \
   /Users/motolaniolaiya/kitchensink/.venv/bin/python -m django test \
   --testrunner=django.test.runner.DiscoverRunner ocyan.plugin.coyote.tests

Recommended isolated test path
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For fast deterministic plugin verification, prefer the plugin-local settings
module via the host ``bin/manage`` bootstrap:

.. code-block:: bash

   cd /Users/motolaniolaiya/kitchensink
   DJANGO_SETTINGS_MODULE=ocyan.plugin.coyote.test_settings \
   bin/manage test \
   ocyan.plugin.coyote.tests.test_smoke \
   ocyan.plugin.coyote.tests.test_utils

That isolated path keeps the Coyote smoke/unit suite out of the full Kitchensink
URL tree and avoids the monolithic test database setup that is unrelated to the
plugin itself.

Integration checks
~~~~~~~~~~~~~~~~~~

Keep the broader host validation separate:

.. code-block:: bash

   cd /Users/motolaniolaiya/kitchensink
   bin/manage check
   bin/manage makemigrations --check --dry-run coyote