Source code for core.manifest
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Manages content manifests for graphics, mods, and utilities."""
import os
from . import json_config, paths
from .lnp import lnp
[docs]def get_cfg(content_type, item):
"""Returns a JSONConfiguration object for the given item.
**Manifest format:**
The manifest is a dictionary of values, which can be saved as manifest.json
in the top level of the content folder. Content is as below, except
that True or False should not be capitalised. Whitespace is irrelevant.
Unused lines can be left out of the file.
'title' and 'tooltip' control presentation in the list for that kind of
content. Both should be strings. Title is the name in the list; tooltip
is the hovertext - linebreaks are inserted with ``\\n``, since it must be
one ine in the manifest file.
'folder_prefix' controls what the name of the graphics pack's folder must
begin with.
'author' and 'version' are strings for the author and version of the
content. Both are for information only at this stage.
'df_min_version', 'df_max_version', and 'df_incompatible_versions' allow
you to specify versions of DF with which the content is incompatible.
Versions are strings of numbers, of the format '0.40.24'. Min and max are
the lowest and highest compatible versions; anything outside that range has
the content hidden. If they are not set, they assume all earlier or later
versions are compatible. incompatible_versions is a list of specific
versions which are incompatible, for when the range alone is insufficient.
'needs_dfhack' is a boolean value, and should only be True if the content
does not function *at all* without DFHack. Partial requirements can be
explained to the user with the 'tooltip' field.
Args:
content_type: 'graphics', 'mods', or 'utilities'
item: content identifier path segment, such that
the full path is ``'LNP/content_type/item/*'``
Returns:
core.json_config.JSONConfiguration: manifest object
"""
default_config = {
'author': '',
'content_version': '',
'df_min_version': '',
'df_max_version': '',
'df_incompatible_versions': [],
'needs_dfhack': False,
'title': '',
'folder_prefix': '',
'tooltip': ''
}
if content_type == 'utilities':
default_config.update({
'win_exe': '',
'osx_exe': '',
'linux_exe': '',
'launch_with_terminal': False,
'readme': '',
})
manifest = paths.get(content_type, item, 'manifest.json')
return json_config.JSONConfiguration(manifest, default_config, warn=False)
[docs]def exists(content_type, item):
"""Returns a bool, that the given item has a manifest.
Used before calling get_cfg if logging a warning isn't required."""
return os.path.isfile(paths.get(content_type, item, 'manifest.json'))
[docs]def is_compatible(content_type, item, ver=''):
"""Boolean compatibility rating; True unless explicitly incompatible."""
if not exists(content_type, item):
return True
if not ver:
ver = lnp.df_info.version
cfg = get_cfg(content_type, item)
df_min_version = cfg.get_string('df_min_version')
df_max_version = cfg.get_string('df_max_version')
return not any([
ver < df_min_version,
(ver > df_max_version and df_max_version),
ver in cfg.get_list('incompatible_df_versions'),
cfg.get_bool('needs_dfhack') and 'dfhack' not in lnp.df_info.variations
])