This repository has been archived on 2020-09-29. You can view files and clone it, but cannot push or open issues/pull-requests.
flatfilecms/flatfilecms/scripts/generate.py

87 lines
2.8 KiB
Python

import os
from distutils.dir_util import copy_tree
from pathlib import Path, PurePath
import argparse
from pyramid.paster import bootstrap
from pyramid.scripts.common import parse_vars
from pyramid.path import AssetResolver
from pyramid.request import Request
from flatfilecms.models import Folder, Document
class Renderer:
def __init__(self, b, dest):
self.app = b["app"]
self.root = b["root"]
self.request = b["request"]
self.dest = dest
def render_folder(self, folder=None, path=PurePath("")):
if folder is None:
folder = self.root
for k, v in folder.items():
new_path = path / k
if isinstance(v, Folder):
(self.dest / new_path).mkdir(exist_ok=True)
self.render_folder(v, new_path)
elif isinstance(v, Document):
url = str(path / k)
if k == "index":
new_path = new_path.with_suffix(".html")
url = str(path) if path != PurePath("") else "/"
elif len(new_path.suffix) == 0:
(self.dest / new_path).mkdir(exist_ok=True)
new_path = new_path / "index.html"
print("Generating {}".format(url))
with (self.dest / new_path).open("wb") as f:
request = Request.blank(url)
f.write(request.get_response(self.app).body)
def WritableDirectory(value):
p = Path(value)
if not p.exists():
p.mkdir()
return p
if not p.is_dir():
raise argparse.ArgumentTypeError("{0} is not a directory".format(p))
if os.access(p, os.W_OK):
return p
else:
raise argparse.ArgumentTypeError("{0} is not a writable directory".format(p))
def main():
parser = argparse.ArgumentParser(description="Generate static pages.")
parser.add_argument(
"-c",
"--config",
help="use configuration file " "like production.ini or development.ini",
required=True,
)
parser.add_argument(
"path", help="where to store generated files", type=WritableDirectory
)
parser.add_argument(
"-o",
"--options",
nargs="*",
default={},
type=parse_vars,
help="additional options in form OPTION=VALUE",
)
args = parser.parse_args()
b = bootstrap(args.config, **args.options)
introspector = b["registry"].introspector
a = AssetResolver()
for v in introspector.get_category("static views"):
print("Copying static dir {}".format(v["introspectable"]["name"]))
p = a.resolve(v["introspectable"]["spec"]).abspath()
copy_tree(str(p), str(args.path / v["introspectable"]["name"]))
r = Renderer(b, args.path)
r.render_folder()