-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdataproxy.py
149 lines (117 loc) · 4.68 KB
/
dataproxy.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# coding: utf-8
from hyde.model import Expando
from hyde.plugin import Plugin
from fswrap import FS, File
from glob import glob
from jinja2 import Template
from contextlib import contextmanager
import yaml
class DataproxyData(Expando):
"""
represents data for data proxy
"""
@classmethod
def FromDataPathes(klass, datapathes):
expanded_pathes = glob(FS(datapathes).fully_expanded_path)
return [klass(datapath) for datapath in expanded_pathes]
def __init__(self, data_file):
with open(data_file, "r") as f:
self.__data = yaml.load(f.read())
super(DataproxyData, self).__init__(self.__data)
self.__data_file = File(data_file)
@property
def data_file(self):
return self.__data_file
class DataproxySource(Expando):
"""
represents template for data proxy
"""
def __init__(self, site_config, source_config):
def combine_path(parent, leaf):
return FS.file_or_folder(parent.child(leaf))
super(DataproxySource, self).__init__({
"template": combine_path(site_config.content_root_path, source_config.template),
"filename": combine_path(site_config.deploy_root_path, source_config.filename),
"dataprefix": source_config.dataprefix
})
class Dataproxy(object):
def __init__(self, source, data):
super(Dataproxy, self).__init__()
self.data = data
self.source = source
self._filename_ = None
@property
def filename(self):
if self._filename_ is None:
self._filename_ = self._generate_filename_()
return self._filename_
def _generate_filename_(self):
return FS.file_or_folder(
Template(self.source.filename.path).render(self.data))
def generate_page(self):
"""
OBSOLETED
"""
with open(self.source.template, "r") as ft:
with open(self.filename, "w") as fw:
fw.write(Template(ft.read()).render({self.source.dataprefix: self.data}))
class DataproxyPlugin(Plugin):
def __init__(self, site):
super(DataproxyPlugin, self).__init__(site)
self.proxies = []
def begin_site(self):
"""
Retrieve proxy configurations and store it.
"""
if not hasattr(self.site.config, 'proxies'):
return # nothing to do
site_config = self.site.config
proxy_config = site_config.proxies
self.proxy_data = DataproxyData.FromDataPathes(proxy_config.data.path)
self.proxy_sources = [DataproxySource(site_config, source_config)
for source_config
in proxy_config.sources]
for data in self.proxy_data:
for source in self.proxy_sources:
self.proxies.append(Dataproxy(source, data))
def begin_node(self, node):
"""
Remove template's resource from nodes and add data resource.
"""
if not node.__class__.__name__ == "RootNode":
return
self.remove_templates_from_node(node)
self.add_data_resources_to_node(node)
def remove_templates_from_node(self, root_node):
for source in self.proxy_sources:
resource = root_node.resource_from_path(source.template)
node = resource.node
node.resources.remove(resource)
def add_data_resources_to_node(self, root_node):
with self.suppress_duplication_checker(root_node) as root_node:
for proxy in self.proxies:
resource = root_node.add_resource(proxy.source.template)
setattr(resource, proxy.source.dataprefix, proxy.data)
setattr(resource, "data_file", proxy.data.data_file)
setattr(resource, "nocaches", True)
if not hasattr(resource, "depends"):
setattr(resource, "depends", [])
resource.depends.append(proxy.data.data_file)
resource.set_relative_deploy_path(
proxy.filename.get_relative_path(
self.site.config.deploy_root_path
)
)
@contextmanager
def suppress_duplication_checker(self, node):
org_func = node.resource_from_path
node.resource_from_path = lambda path: None
yield node
node.resource_from_path = org_func
def append_data_to_template_resource(self, node):
"""
XXX : evation, remove me.
"""
for source in self.proxy_sources:
resource = node.resource_from_path(source.template)
setattr(resource, source.dataprefix, self.proxy_data[0])