"""Data interface functions for the mudpy engine."""
-# Copyright (c) 2004-2017 Jeremy Stanley <fungi@yuggoth.org>. Permission
-# to use, copy, modify, and distribute this software is granted under
-# terms provided in the LICENSE file distributed with this software.
+# Copyright (c) 2004-2018 mudpy authors. Permission to use, copy,
+# modify, and distribute this software is granted under terms
+# provided in the LICENSE file distributed with this software.
import os
import re
import yaml
+class _IBSEmitter(yaml.emitter.Emitter):
+
+ """Override the default YAML Emitter to indent block sequences."""
+
+ def expect_block_sequence(self):
+ """Match the expectations of the ``yamllint`` style checker."""
+
+ # TODO(fungi) Get an option for this implemented upstream in
+ # the pyyaml library
+ self.increase_indent(flow=False, indentless=False)
+ self.state = self.expect_first_block_sequence_item
+
+
+class _IBSDumper(yaml.SafeDumper, _IBSEmitter):
+
+ """Use our _IBSEmitter instead of the default implementation."""
+
+ pass
+
+
class Data:
"""A file containing universe elements and their facets."""
self.source, relative=self.relative, universe=self.universe)
try:
self.data = yaml.safe_load(open(self.source))
+ log_entry = ("Loaded file %s into memory." % self.source, 5)
except FileNotFoundError:
# it's normal if the file is one which doesn't exist yet
self.data = {}
log_entry = ("File %s is unavailable." % self.source, 6)
- try:
- mudpy.misc.log(*log_entry)
- except NameError:
- # happens when we're not far enough along in the init process
- self.universe.setup_loglines.append(log_entry)
+ try:
+ mudpy.misc.log(*log_entry)
+ except NameError:
+ # happens when we're not far enough along in the init process
+ self.universe.setup_loglines.append(log_entry)
if not hasattr(self.universe, "files"):
self.universe.files = {}
self.universe.files[self.source] = self
includes = []
for node in list(self.data):
if node == "_load":
- for included in self.data["_load"]:
- included = find_file(
- included,
- relative=self.source,
- universe=self.universe)
- if included not in includes:
- includes.append(included)
+ includes += self.data["_load"]
continue
if node.startswith("_"):
continue
):
# make parent directories if necessary
- if not os.path.exists(os.path.dirname(self.source)):
- old_umask = os.umask(normal_umask)
- os.makedirs(os.path.dirname(self.source))
- os.umask(old_umask)
+ old_umask = os.umask(normal_umask)
+ os.makedirs(os.path.dirname(self.source), exist_ok=True)
+ os.umask(old_umask)
# backup the file
if "mudpy.limit" in self.universe.contents:
os.umask(old_umask)
# write and close the file
- yaml.safe_dump(self.data, allow_unicode=True,
- default_flow_style=False, stream=file_descriptor)
+ yaml.dump(self.data, Dumper=_IBSDumper, allow_unicode=True,
+ default_flow_style=False, explicit_start=True, indent=4,
+ stream=file_descriptor)
file_descriptor.close()
# unset the modified flag
def find_file(
file_name=None,
- category=None,
+ group=None,
prefix=None,
relative=None,
search=None,