Переглянути джерело

Build script, project layout

pull/24/head
Ben Kurtovic 13 роки тому
джерело
коміт
80580789ec
5 змінених файлів з 152 додано та 11 видалено
  1. +3
    -0
      .gitignore
  2. +146
    -0
      build.py
  3. +0
    -9
      copyvio.fcgi
  4. +1
    -0
      pages/hello.mako
  5. +2
    -2
      rewrite.script

+ 3
- 0
.gitignore Переглянути файл

@@ -0,0 +1,3 @@
*.pyc
temp/
www/

+ 146
- 0
build.py Переглянути файл

@@ -0,0 +1,146 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import os
import shutil

page_src = """#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
os.chdir("..")

from mako.template import Template
from mako.lookup import TemplateLookup

def myapp(environ, start_response):
start_response("200 OK", [("Content-Type", "text/html")])
lookup = TemplateLookup(directories=["{{support_dir}}"])
template = Template(filename="{{src}}", module_directory="{{temp_dir}}",
lookup=lookup)
return [template.render(environ=environ).encode("utf8")]

if __name__ == "__main__":
from flup.server.fcgi import WSGIServer
WSGIServer(myapp).run()
"""

rewrite_script_src = """match URL into $ with ^/~earwig/{0}(\?.*?)?$
if matched then
set URL = /~earwig/rewrite/{0}.fcgi$1
goto END
endif
"""

class Builder(object):
def __init__(self):
self.build_dir = "www"
self.static_dir = "static"
self.pages_dir = "pages"
self.support_dir = "support"
self.temp_dir = "temp"
self.rs_file = "rewrite.script"

self.root = logging.getLogger("builder")
self.root.addHandler(logging.NullHandler())
self._pages = []

def _enable_logging(self):
handler = logging.StreamHandler()
handler.setFormatter(_LogFormatter())
self.root.addHandler(handler)
self.root.setLevel(logging.DEBUG)

def _gen_page(self, page, base):
if not page.endswith(".mako"):
base.warn("Skipping {0} (not endswith('.mako'))".format(page))
return

logger = base.getChild(page.rsplit(".", 1)[0])
self._pages.append(page.rsplit(".", 1)[0])
src = os.path.join(self.pages_dir, page)
dest = os.path.join(self.build_dir, page.replace(".mako", ".fcgi"))

logger.debug("build {0} -> {1}".format(src, dest))
content = page_src.replace("{{src}}", src)
content = content.replace("{{support_dir}}", self.support_dir)
content = content.replace("{{temp_dir}}", self.temp_dir)
with open(dest, "w") as fp:
fp.write(content)

logger.debug("chmod 0755 {0}".format(dest))
os.chmod(dest, 0755)

def clean(self):
logger = self.root.getChild("clean")
targets = (self.build_dir, self.temp_dir)

for target in targets:
if os.path.exists(target):
logger.debug("rm -r {0}".format(target))
shutil.rmtree(target)

logger.debug("mkdir {0}".format(target))
os.mkdir(target)

def gen_static(self):
logger = self.root.getChild("static")
dest = os.path.join(self.build_dir, "static")

logger.debug("copytree {0} -> {1}".format(self.static_dir, dest))
shutil.copytree(self.static_dir, dest)

def gen_pages(self):
logger = self.root.getChild("pages")
pages = os.listdir(self.pages_dir)
for page in pages:
self._gen_page(page, logger)

def gen_zws(self):
logger = self.root.getChild("zws")
target = self.rs_file

if os.path.exists(target):
logger.debug("rm {0}".format(target))
os.remove(target)

logger.debug("build rewrite.script")
with open(target, "w") as fp:
for page in self._pages:
fp.write(rewrite_script_src.format(page))

def build(self):
self._enable_logging()
self.root.info("Building project...")
self.clean()
self.gen_static()
self.gen_pages()
self.gen_zws()
self.root.info("Done!")


class _LogFormatter(logging.Formatter):
def __init__(self):
fmt = "[%(asctime)s %(lvl)s] %(name)s: %(message)s"
datefmt = "%Y-%m-%d %H:%M:%S"
_format = super(_LogFormatter, self).format
self.format = lambda record: _format(self.colorize(record))
super(_LogFormatter, self).__init__(fmt=fmt, datefmt=datefmt)

def colorize(self, record):
l = record.levelname.ljust(8)
if record.levelno == logging.DEBUG:
record.lvl = l.join(("\x1b[34m", "\x1b[0m")) # Blue
if record.levelno == logging.INFO:
record.lvl = l.join(("\x1b[32m", "\x1b[0m")) # Green
if record.levelno == logging.WARNING:
record.lvl = l.join(("\x1b[33m", "\x1b[0m")) # Yellow
if record.levelno == logging.ERROR:
record.lvl = l.join(("\x1b[31m", "\x1b[0m")) # Red
if record.levelno == logging.CRITICAL:
record.lvl = l.join(("\x1b[1m\x1b[31m", "\x1b[0m")) # Bold red
return record


if __name__ == "__main__":
Builder().build()

+ 0
- 9
copyvio.fcgi Переглянути файл

@@ -1,9 +0,0 @@
#! /usr/bin/env python

def myapp(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello World!\n']

if __name__ == "__main__":
from flup.server.fcgi import WSGIServer
WSGIServer(myapp).run()

+ 1
- 0
pages/hello.mako Переглянути файл

@@ -0,0 +1 @@
Hello World!

+ 2
- 2
rewrite.script Переглянути файл

@@ -1,5 +1,5 @@
match URL into $ with ^/~earwig/copyvio(\?.*?)?$
match URL into $ with ^/~earwig/hello(\?.*?)?$
if matched then
set URL = /~earwig/rewrite/copyvio.fcgi$1
set URL = /~earwig/rewrite/hello.fcgi$1
goto END
endif

Завантаження…
Відмінити
Зберегти