Skip to content

Commit ad62560

Browse files
author
Jakub Kaczmarzyk
authored
add save instance method (#273)
1 parent f5d95fa commit ad62560

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

neurodocker/generators/common.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import datetime
44
import json
5+
import os
56
import posixpath
67

78
from neurodocker import __version__
@@ -101,6 +102,14 @@ class ContainerSpecGenerator:
101102
def render(self):
102103
raise NotImplementedError("not implemented")
103104

105+
def save(self, filepath):
106+
"""Save the rendered container specification to a file."""
107+
if os.path.exists(filepath):
108+
raise FileExistsError("File already exists: {}".format(filepath))
109+
rendered = self.render()
110+
with open(filepath, mode='w') as fp:
111+
fp.write(rendered + '\n')
112+
104113
@property
105114
def commented_header(self):
106115
t = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")

neurodocker/generators/docker.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,14 @@ def __init__(self, specs):
288288
self._prep()
289289
_Users.clear_memory()
290290

291+
self._rendered = False
292+
291293
def render(self):
292-
return self.commented_header + "\n\n".join(
293-
self._ispecs_to_dockerfile_str())
294+
# Cache the rendered string.
295+
if not self._rendered:
296+
self._rendered = self.commented_header + "\n\n".join(
297+
self._ispecs_to_dockerfile_str())
298+
return self._rendered
294299

295300
def _prep(self):
296301
self._add_json()

neurodocker/generators/singularity.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,20 @@ def __init__(self, specs):
104104
self._add_neurodocker_header()
105105
self._add_json()
106106

107+
self._rendered = False
108+
107109
def render(self):
108110
def _render_one(section):
109111
renderer = getattr(self, "_render_{}".format(section))
110112
return renderer()
111113

112114
if not self._parts_filled:
113115
self._fill_parts()
114-
return self.commented_header + "\n\n".join(
115-
map(_render_one, (sec for sec, con in self._order if con)))
116+
117+
if not self._rendered:
118+
self._rendered = self.commented_header + "\n\n".join(
119+
map(_render_one, (sec for sec, con in self._order if con)))
120+
return self._rendered
116121

117122
def _render_header(self):
118123
return "\n".join(

0 commit comments

Comments
 (0)