2.3 File Tasks¶
2.3.1 File Task¶
Task class can be extended to your own needs, but in most cases we want file related tasks, for example “build file if other file has rebuilded”, or “create file if not exists”. For this purpose Baelfire comes with FileTask.
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 | import logging
from baelfire.core import Core
from baelfire.dependencies import RunTask
from baelfire.task import FileTask
from baelfire.task import Task
class MyCore(Core):
def phase_settings(self):
super().phase_settings()
self.paths.set('second', '/tmp/second.txt')
class FirstTask(FileTask):
output = '/tmp/first.txt'
def build(self):
with open(self.output, 'w') as myfile:
myfile.write('First')
class SecondTask(FileTask):
output_name = 'second'
def build(self):
with open(self.output, 'w') as myfile:
myfile.write('Second')
class ParentTask(Task):
def create_dependecies(self):
self.build_if(RunTask(FirstTask()))
self.build_if(RunTask(SecondTask()))
def build(self):
pass
if __name__ == '__main__':
FORMAT = ' * %(levelname)s %(name)s: %(message)s *'
logging.basicConfig(level=logging.DEBUG, format=FORMAT)
ParentTask(MyCore()).run()
|
$ python doc5.py
* DEBUG __main__.FirstTask: Dependency baelfire.dependencies.file.FileDoesNotExists result: True *
* DEBUG __main__.FirstTask: Need to run: True *
* DEBUG __main__.ParentTask: Dependency baelfire.dependencies.task.RunTask result: False *
* DEBUG __main__.SecondTask: Dependency baelfire.dependencies.file.FileDoesNotExists result: True *
* DEBUG __main__.SecondTask: Need to run: True *
* DEBUG __main__.ParentTask: Dependency baelfire.dependencies.task.RunTask result: False *
* DEBUG __main__.ParentTask: Need to run: False *
* INFO __main__.FirstTask: Running *
* INFO __main__.SecondTask: Running *
FileTask has a default FileDoesNotExists dependency for output file. Path for the output file can be configured by reimplementing output property (direct path to task) or reimplementing output_name property (key used for .paths in Core).
2.3.2 Template Task¶
Template task is used to create a file from template. We use Jinja2 for template system.
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 | from os import getcwd
from baelfire.core import Core
from baelfire.dependencies import TaskRebuilded
from baelfire.task import FileTask
from baelfire.task import TemplateTask
class MyCore(Core):
def phase_settings(self):
super().phase_settings()
self.paths.set('base', getcwd(), is_root=True)
self.paths.set('source', 'source.txt', 'base')
self.paths.set('output', 'output.txt', 'base')
class CreateSource(FileTask):
output_name = 'source'
def build(self):
with open(self.output, 'w') as output:
output.write("{{paths.get('source')}}\n")
output.write("{{paths.get('output')}}\n")
output.write("{{my_context}}\n")
class Something(TemplateTask):
source_name = 'source'
output_name = 'output'
def create_dependecies(self):
super().create_dependecies()
self.build_if(TaskRebuilded(CreateSource()))
def generate_context(self):
context = super(Something, self).generate_context()
context['my_context'] = 'this is my context'
return context
if __name__ == '__main__':
Something(MyCore()).run()
|
$ python doc6.py
$ cat source.txt
{{paths.get('source')}}
{{paths.get('output')}}
{{my_context}}
$ cat output.txt
/home/socek/projects/baelfire/doc/code/source.txt
/home/socek/projects/baelfire/doc/code/output.txt
this is my context
We created 2 tasks. First to create the template and second to create a file from template. Default context has settings
and paths in it. If we want to add something to context just ovveride generate_context method:
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 | from os import getcwd
from baelfire.core import Core
from baelfire.dependencies import TaskRebuilded
from baelfire.task import FileTask
from baelfire.task import TemplateTask
class MyCore(Core):
def phase_settings(self):
super().phase_settings()
self.paths.set('base', getcwd(), is_root=True)
self.paths.set('source', 'source2.txt', 'base')
self.paths.set('output', 'output2.txt', 'base')
class CreateSource(FileTask):
output_name = 'source'
def build(self):
with open(self.output, 'w') as output:
output.write("{{paths.get('source')}}\n")
output.write("{{paths.get('output')}}\n")
output.write("{{myvar}}\n")
class Something(TemplateTask):
source_name = 'source'
output_name = 'output'
def create_dependecies(self):
super().create_dependecies()
self.build_if(TaskRebuilded(CreateSource()))
def generate_context(self):
context = super().generate_context()
context['myvar'] = 'my var 10'
return context
if __name__ == '__main__':
Something(MyCore()).run()
|
$ python doc7.py
$ cat source2.txt
{{paths.get('source')}}
{{paths.get('output')}}
{{myvar}}
$ cat output2.txt
/home/socek/projects/baelfire/doc/code/source2.txt
/home/socek/projects/baelfire/doc/code/output2.txt
my var 10