Adding support for Python libraries inside of puzzles and categories

This commit is contained in:
John Donaldson 2019-08-15 23:30:48 +01:00
parent d5b8d5f8f3
commit 1bb777e512
5 changed files with 53 additions and 2 deletions

View File

@ -210,7 +210,7 @@ sessionStorage.setItem("id", "devel-server")
self.end_headers()
self.wfile.write(body.encode('utf-8'))
endpoints.append((r"/", handle_index))
endpoints.append((r"/{ignored}", handle_index))
#endpoints.append((r"/{ignored}", handle_index))
def handle_theme_file(self):

View File

@ -2,6 +2,7 @@
import argparse
import contextlib
import copy
import glob
import hashlib
import html
@ -11,6 +12,7 @@ import mistune
import os
import random
import string
import sys
import tempfile
import shlex
@ -26,9 +28,24 @@ def djb2hash(str):
def pushd(newdir):
curdir = os.getcwd()
os.chdir(newdir)
# Force a copy of the old path, instead of just a reference
old_path = list(sys.path)
old_modules = copy.copy(sys.modules)
sys.path.append(newdir)
print("New path: %s" % (sys.path,))
try:
yield
finally:
# Restore the old path
to_remove = []
for module in sys.modules:
if module not in old_modules:
to_remove.append(module)
for module in to_remove:
del(sys.modules[module])
sys.path = old_path
os.chdir(curdir)
@ -316,6 +333,7 @@ class Category:
with pushd(self.path):
self.catmod.make(points, puzzle)
else:
with pushd(self.path):
puzzle.read_directory(path)
return puzzle

View File

@ -0,0 +1,19 @@
import io
import categorylib # Category-level libraries can be imported here
def make(puzzle):
import puzzlelib # puzzle-level libraries can only be imported inside of the make function
puzzle.authors = ['donaldson']
puzzle.summary = 'more crazy stuff you can do with puzzle generation using Python libraries'
puzzle.body.write("## Crazy Things You Can Do With Puzzle Generation (part II)\n")
puzzle.body.write("\n")
puzzle.body.write("The source to this puzzle has some more advanced examples of stuff you can do in Python.\n")
puzzle.body.write("\n")
puzzle.body.write("1 == %s\n\n" % puzzlelib.getone(),)
puzzle.body.write("2 == %s\n\n" % categorylib.gettwo(),)
puzzle.answers.append('tea')
answer = puzzle.make_answer() # Generates a random answer, appending it to puzzle.answers too
puzzle.log("Answers: {}".format(puzzle.answers))

View File

@ -0,0 +1,7 @@
"""This is an example of a puzzle-level library.
This library can be imported by child puzzles using `import puzzlelib`
"""
def getone():
return 1

View File

@ -0,0 +1,7 @@
"""This is an example of a category-level library.
This library can be imported by child puzzles using `import categorylib`
"""
def gettwo():
return 2