Добавлен скрипт генерации статического сайта generate-static-site [closes #36]

master
Антон Касимов 2019-06-11 17:10:48 +03:00
parent 467a5698f4
commit 6e212f6d08
3 changed files with 87 additions and 1 deletions

View File

View File

@ -0,0 +1,86 @@
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()

View File

@ -60,7 +60,7 @@ setup(
'main = flatfilecms:main',
],
'console_scripts': [
'generate_static_site = flatfilecms.scripts.generate:main',
'generate-static-site = flatfilecms.scripts.generate:main',
],
},
)