Skip to main content

Manage file metadata with YAML front-matter.

Project description

Easy file metadata.

Store metadata in a special YAML configuration header for text files, or a sidecar “shadow” configuration file for binary files.

Caput: n. Latin for “head” or “top”. Root of many English words, such as “captain”, “capital”, and “decapitate”.

Install

Caput is available from PyPI:

pip install caput

Usage

Say that you’re building a static site generator. You can add a metadata header to any textfile. The first three bytes must be ---\n. In index.md:

---
title: My Site
author: Me
featured_image: /images/my-header.jpg
---
# Welcome to my site!

Read the metadata header:

>>> import caput

>>> caput.read_config('./index.md', defaults={'markup': 'markdown'})
{'markup': 'markdown',
 'title': 'My Site',
 'author': 'Me',
 'featured_image': '/images/my-header.jpg'}

Read the file contents:

>>> caput.read_contents('./index.md')
'# Welcome to my site!\n'

Write metadata headers to files:

>>> metadata = {
...     'title': 'My New Post',
...     'author': 'Me',
...     'date': '2024-01-15'
... }

>>> content = '# This is my new post\n\nLorem ipsum...'

>>> caput.write_config('./new-post.md', metadata, content)

>>> # Verify the file was written correctly
>>> caput.read_config('./new-post.md')
{'title': 'My New Post', 'author': 'Me', 'date': '2024-01-15'}

>>> caput.read_contents('./new-post.md')
'# This is my new post\n\nLorem ipsum...'

Update existing metadata:

>>> # Read existing metadata
>>> config = caput.read_config('./index.md')
>>> config['updated'] = '2024-01-15'
>>> config['tags'] = ['blog', 'personal']

>>> # Write back with updated metadata
>>> caput.write_config('./index.md', config)

Read & write contents:

>>> content = caput.read_contents('./index.md')
>>> config = caput.read_config('./index.md')
>>> config['updated'] = '2025-09-09'
>>> content += '\n\nUpdated on 2025-09-09'
>>> caput.write_contents('./index.md', content, config)

Shadow Files for Binary Content

You can add metadata to binary files with a “shadow” header. For your featured image, add a .yml file with the same base name, e.g. for ./images/my-header.jpg you would add ./images/my-header.yml:

title: My Site Header
credit: Me

Read the metadata header:

>>> caput.read_config('./images/my-header.jpg')
{'title': 'My Site Header', 'credit': 'Me')

Read the file contents:

>>> caput.read_contents('./images/my-header.jpg', encoding=None)
b'...binary data...'

Write metadata for binary files:

>>> # Create metadata for a binary file using a shadow YAML file
>>> binary_metadata = {
...     'title': 'Site Logo',
...     'credit': 'Design Team',
...     'license': 'CC BY 4.0'
... }

>>> caput.write_shadow_config('./images/logo.png', binary_metadata)

>>> # This creates ./images/logo.yml with the metadata
>>> caput.read_config('./images/logo.png')
{'title': 'Site Logo', 'credit': 'Design Team', 'license': 'CC BY 4.0'}

Project details


Download files

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

Source Distribution

caput-1.1.tar.gz (69.4 kB view details)

Uploaded Source

Built Distribution

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

caput-1.1-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file caput-1.1.tar.gz.

File metadata

  • Download URL: caput-1.1.tar.gz
  • Upload date:
  • Size: 69.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for caput-1.1.tar.gz
Algorithm Hash digest
SHA256 4481ad1ee754ead7b9b423e7423b353e1962dbda8a026b644bb1259ec9bc21f4
MD5 dc8614bc1033e8b20753cb195b05a17b
BLAKE2b-256 13fbea55a4399ecda7114c1ef44c3a449c17ae0532dca9a5da05695b579fcd1f

See more details on using hashes here.

File details

Details for the file caput-1.1-py3-none-any.whl.

File metadata

  • Download URL: caput-1.1-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for caput-1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a951b25b4c0a5860db92e3fe6eeb5183f779fa976c4f15533feceeb8834158e3
MD5 73d62fbea72574e18e8074500927f450
BLAKE2b-256 c188ce3e9137530ba08afce4107b4a2a9ca7d2503b873365c8d85fd1acaead77

See more details on using hashes here.

Supported by

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