Merge pull request #80 from int00h5525/add_local_python_library_support

Add local python library support
This commit is contained in:
int00h5525 2019-10-18 16:23:54 -05:00 committed by GitHub
commit 6114f58e62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 2 deletions

View File

@ -2,6 +2,7 @@
import argparse import argparse
import contextlib import contextlib
import copy
import glob import glob
import hashlib import hashlib
import html import html
@ -11,6 +12,7 @@ import mistune
import os import os
import random import random
import string import string
import sys
import tempfile import tempfile
import shlex import shlex
import yaml import yaml
@ -27,9 +29,25 @@ def djb2hash(str):
def pushd(newdir): def pushd(newdir):
curdir = os.getcwd() curdir = os.getcwd()
os.chdir(newdir) 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)
try: try:
yield yield
finally: 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) os.chdir(curdir)
@ -363,7 +381,7 @@ class Puzzle:
files = [fn for fn,f in self.files.items() if f.visible] files = [fn for fn,f in self.files.items() if f.visible]
return { return {
'authors': self.authors, 'authors': self.get_authors(),
'hashes': self.hashes(), 'hashes': self.hashes(),
'files': files, 'files': files,
'scripts': self.scripts, 'scripts': self.scripts,
@ -411,6 +429,7 @@ class Category:
with pushd(self.path): with pushd(self.path):
self.catmod.make(points, puzzle) self.catmod.make(points, puzzle)
else: else:
with pushd(self.path):
puzzle.read_directory(path) puzzle.read_directory(path)
return puzzle 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 sibling 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