diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ca8f2f..b76b209 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - URL parameter to points.json to allow returning only the JSON for a single team by its team id (e.g., points.json?id=abc123). - Include basic metadata in mothballs +### Fixed +- Handle cases where non-legacy puzzles don't have an `author` attribute +- Handle YAML-formatted file and script lists as expected +- YAML-formatted example puzzle actually works as expected ## [3.4.3] - 2019-11-20 ### Fixed diff --git a/devel/moth.py b/devel/moth.py index f82e024..95c2c5a 100644 --- a/devel/moth.py +++ b/devel/moth.py @@ -237,11 +237,39 @@ class Puzzle: except IndexError: pass self.files[name] = PuzzleFile(stream, name, not hidden) + + elif key == 'files' and isinstance(val, dict): + for filename, options in val.items(): + if "source" in options: + source = options["source"] + else: + source = filename + + if "hidden" in options and options["hidden"]: + hidden = True + else: + hidden = False + + stream = open(source, "rb") + self.files[filename] = PuzzleFile(stream, filename, not hidden) + + elif key == 'files' and isinstance(val, list): + for filename in val: + stream = open(filename, "rb") + self.files[filename] = PuzzleFile(stream, filename) + elif key == 'script': stream = open(val, 'rb') # Make sure this shows up in the header block of the HTML output. self.files[val] = PuzzleFile(stream, val, visible=False) self.scripts.append(val) + + elif key == "scripts" and isinstance(val, list): + for script in val: + stream = open(script, "rb") + self.files[script] = PuzzleFile(stream, script, visible=False) + self.scripts.append(script) + elif key == "objective": self.objective = val elif key == "success": @@ -388,7 +416,12 @@ class Puzzle: self.body.write('') def get_authors(self): - return self.authors or [self.author] + if len(self.authors) > 0: + return self.authors + elif hasattr(self, "author"): + return [self.author] + else: + return [] def get_body(self): return self.body.getvalue()