yamdl
Lets you store instances of Django models as flat files (simplified fixtures). For when you want to store content in a Git repo, but still want to be able to use the normal Django ORM methods and shortcut functions.
It works by loading the data into an in-memory SQLite database on startup, and then serving queries from there. This means it adds a little time to your app’s boot, and slightly more RAM usage, but with the advantage of a much easier time dealing with static files (rather than custom code to load them directly).
It does not persist changes to the models back into files - this is purely for authoring content in a text editor and using it via Django.
Due to Python limitations yamdl currently only works on Python 3.4 and up.
Why not use normal fixtures?
They’re not only a little verbose, but they need to be loaded into a non-memory database (slower) and you need lots of logic to work out if you should update or delete existing entries. They’re still a better solution for anything that has a lot of data or which needs JOINs, though.
Installation
First, install the package:
pip install yamdl
Then, add it to INSTALLED_APPS:
INSTALLED_APPS = [
...
'yamdl',
...
]
Then, add the in-memory database to DATABASES (note that you must have at least Python 3.4 to have a SQlite module that understands shared memory URIs):
DATABASES = {
...
'yamdl': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'file:yamdl-db?mode=memory&cache=shared',
}
}
Then, add a YAMDL_DIRECTORIES setting which defines where your directories of YAML files can be found (it’s a list):
YAMDL_DIRECTORIES = [
os.path.join(PROJECT_DIR, "content"),
]
Finally, add the database router:
DATABASE_ROUTERS = [
"yamdl.router.YamdlRouter",
]
Usage
First, add the __yamdl__ attribute to the models you want to use static content. A model can only be static or dynamic, not both:
class MyModel(models.Model):
...
__yamdl__ = True
Then, start making static files under one of the directories you listed in the YAMDL_DIRECTORIES setting above. Within one of these, make a directory with the format appname.modelname, and then YAML files ending in .yaml:
andrew-site/
content/
speaking.Talk/
2017.yaml
2016.yaml
Within those YAML files, you can define either a list of model instances, like this:
- title: 'Alabama' section: us-states - title: 'Alaska' section: us-states done: 2016-11-18 place_name: Fairbanks - title: 'Arizona' section: us-states done: 2016-05-20 place_name: Flagstaff
Or a single model instance at the top level, like this:
conference: DjangoCon AU title: Horrors of Distributed Systems when: 2017-08-04 description: Stepping through some of the myriad ways in which systems can fail that programmers don't expect, and how this hostile environment affects the design of distributed systems. city: Melbourne country: AU slides_url: https://speakerdeck.com/andrewgodwin/horrors-of-distributed-systems video_url: https://www.youtube.com/watch?v=jx1Hkxe64Xs
When you start up Django, as either runserver or in production, it will read the YAML files and load them into an in-memory database and then let you query them using all the standard ORM stuff.
Todo
Here’s a short list of things I’d like to get done before a 1.0:
Maybe replace the __yamdl__ attribute with something nicer.
Support for Python versions before 3.4, either by using a global SQLite :memory: instance with thread locking or by supporting disk databases with a wipe phase.
Include YAML files in the Django auto-reloader so editing them loads changes in development.
Potentially load changes to flat files in production using mtime checking.
Metadata
Release files for yamdl 0.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| yamdl-0.9.tar.gz | 5.1 kB | Without provenance | Details for yamdl-0.9.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| yamdl-0.9-py3-none-any.whl | Python 3 | none | any | Details for yamdl-0.9-py3-none-any.whl |
Total release size: 13.5 kB
Release files / yamdl-0.9.tar.gz
| Download URL | yamdl-0.9.tar.gz |
|---|---|
| Size | 5.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e6e83461d05ca014db28bb70a4319aa2477ed5ca231e0fbe277f00bf444c3054
|
|
BLAKE2b-256 checksum How to use checksums |
a2b08eb3e7b6e887a59dceef28e3b0d5e2c6216ca146b857beb5411473a1c538
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Release files / yamdl-0.9-py3-none-any.whl
| Download URL | yamdl-0.9-py3-none-any.whl |
|---|---|
| Size | 8.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d5c385fb61e9abff55be0af789555ea98c7c4a1b857bd1dcc8925330b5a7c4b
|
|
BLAKE2b-256 checksum How to use checksums |
f338cbdd3b3edfd31481a5c52a578aefd6f5af1f38794bd30aa019bd79972e1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for yamdl 0.9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.