From 6e212f6d0872c387bfa7e7df1d1b19b7c58d7506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=9A=D0=B0=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2?= Date: Tue, 11 Jun 2019 17:10:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=81?= =?UTF-8?q?=D0=B0=D0=B9=D1=82=D0=B0=20generate-static-site=20[closes=20#36?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flatfilecms/scripts/__init__.py | 0 flatfilecms/scripts/generate.py | 86 +++++++++++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 flatfilecms/scripts/__init__.py create mode 100644 flatfilecms/scripts/generate.py diff --git a/flatfilecms/scripts/__init__.py b/flatfilecms/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flatfilecms/scripts/generate.py b/flatfilecms/scripts/generate.py new file mode 100644 index 0000000..8c4e919 --- /dev/null +++ b/flatfilecms/scripts/generate.py @@ -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() diff --git a/setup.py b/setup.py index 0c899ca..9893b02 100644 --- a/setup.py +++ b/setup.py @@ -60,7 +60,7 @@ setup( 'main = flatfilecms:main', ], 'console_scripts': [ - 'generate_static_site = flatfilecms.scripts.generate:main', + 'generate-static-site = flatfilecms.scripts.generate:main', ], }, )