forked from Pelican-Elegant/elegant
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tasks.py
132 lines (102 loc) · 3.67 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# -*- coding: utf-8 -*-
import os
import shutil
import sys
import datetime
from invoke import task
from invoke.util import cd
from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer
from pelican.settings import DEFAULT_CONFIG, get_settings_from_file
SETTINGS_FILE_BASE = "pelicanconf.py"
SETTINGS = {}
SETTINGS.update(DEFAULT_CONFIG)
LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE)
SETTINGS.update(LOCAL_SETTINGS)
CONFIG = {
"settings_base": SETTINGS_FILE_BASE,
"settings_publish": "publishconf.py",
# Output path. Can be absolute or relative to tasks.py. Default: 'output'
"deploy_path": SETTINGS["OUTPUT_PATH"],
# Port for `serve`
"port": 9001,
}
@task
def clean(c):
"""Remove generated files"""
if os.path.isdir(CONFIG["deploy_path"]):
shutil.rmtree(CONFIG["deploy_path"])
os.makedirs(CONFIG["deploy_path"])
@task
def build(c):
"""Build local version of site"""
c.run("pelican -s {settings_base}".format(**CONFIG))
@task
def rebuild(c):
"""`build` with the delete switch"""
c.run("pelican -d -s {settings_base}".format(**CONFIG))
@task
def regenerate(c):
"""Automatically regenerate site upon file modification"""
c.run("pelican -r -s {settings_base}".format(**CONFIG))
@task
def serve(c):
"""Serve site at http://localhost:$PORT/ (default port is 8000)"""
class AddressReuseTCPServer(RootedHTTPServer):
allow_reuse_address = True
server = AddressReuseTCPServer(
CONFIG["deploy_path"], ("", CONFIG["port"]), ComplexHTTPRequestHandler
)
sys.stderr.write("Serving on port {port} ...\n".format(**CONFIG))
server.serve_forever()
@task
def reserve(c):
"""`build`, then `serve`"""
build(c)
serve(c)
@task
def preview(c):
"""Build production version of site"""
c.run("pelican -s {settings_publish}".format(**CONFIG))
@task
def livereload(c):
"""Automatically reload browser tab upon file modification."""
from livereload import Server
build(c)
server = Server()
# Watch the base settings file
server.watch(CONFIG["settings_base"], lambda: build(c))
# Watch content source files
content_file_extensions = [".md", ".rst"]
for extension in content_file_extensions:
content_blob = "{0}/**/*{1}".format(SETTINGS["PATH"], extension)
server.watch(content_blob, lambda: build(c))
# Watch the theme's templates and static assets
theme_path = SETTINGS["THEME"]
server.watch("{}/templates/*.html".format(theme_path), lambda: build(c))
static_file_extensions = [".css", ".js"]
for extension in static_file_extensions:
static_file = "{0}/static/**/*{1}".format(theme_path, extension)
server.watch(static_file, lambda: build(c))
# Serve output path on configured port
server.serve(port=CONFIG["port"], root=CONFIG["deploy_path"])
@task
def publish(c):
"""Publish to production via rsync"""
c.run("pelican -s {settings_publish}".format(**CONFIG))
@task
def plugins_sync(c):
"""Make a fresh shallow copy of pelican-plugins"""
c.run("rm -rf plugins")
# For now we don't need submodules plugins. When we do, use
# --recurse-submodules and --shallow-submodules switches
# Do specify path in --recurse-submodules so that only relevant plugin is downloaded
c.run(
"git clone --jobs 8 --depth 1 --shallow-submodules https://github.com/getpelican/pelican-plugins.git plugins"
)
@task
def theme_sync(c):
"""Make a fresh shallow copy of pelican-elegant theme"""
c.run("rm -rf themes")
c.run(
"git clone --jobs 8 --recurse-submodules --depth 1 --shallow-submodules https://github.com/Pelican-Elegant/elegant.git themes/elegant"
)