From 8154663a3993a25c05de6516da4437cf5d633e1f Mon Sep 17 00:00:00 2001 From: Diogo Dutra Date: Sat, 28 Sep 2019 12:11:08 -0300 Subject: [PATCH] Create feature to include others Bakefiles --- bake/bakefile.py | 59 ++++++++++++++++++++++++++++++++++++++-- tests/include.Bakefile | 3 ++ tests/include.bats | 24 ++++++++++++++++ tests/included1.Bakefile | 2 ++ tests/included2.Bakefile | 4 +++ tests/included3.Bakefile | 2 ++ 6 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 tests/include.Bakefile create mode 100755 tests/include.bats create mode 100644 tests/included1.Bakefile create mode 100644 tests/included2.Bakefile create mode 100644 tests/included3.Bakefile diff --git a/bake/bakefile.py b/bake/bakefile.py index 95b3edd..c0de128 100644 --- a/bake/bakefile.py +++ b/bake/bakefile.py @@ -23,6 +23,7 @@ class Bakefile: self._chunks = [] self.args = [] self.debug = debug + self._included_sources = None if not os.path.exists(path): raise NoBakefileFound() @@ -158,12 +159,25 @@ class Bakefile: @property def source(self): + included_content = '' + content = self._get_source() + + for included_source in self.included_sources: + included_content += included_source + '\n' + + return included_content + content + + def _get_source(self): with open(self.path, "r") as f: return f.read() @property def source_lines(self): - return self.source.split("\n") + return [ + line + for line in self.source.split("\n") + if not self._is_include_line(line) + ] def _is_declaration_line(self, line, collect_all=False): line = line.replace("\t", " " * 4) @@ -214,7 +228,7 @@ class Bakefile: tasks[script.name] = script self._tasks = tasks - return self.tasks + return self._tasks @property def iter_root_source_lines(self): @@ -236,6 +250,47 @@ class Bakefile: """The source of the 'root level' of the Bashfile.""" return "\n".join(list(self.iter_root_source_lines)) + @property + def included_sources(self): + if self._included_sources is not None: + return self._included_sources + + return self._get_included_sources_recursively(self._get_source()) + + def _is_include_line(self, line): + return line.startswith('include ') + + def _get_included_sources_recursively(self, source, already_got=None): + if already_got is None: + already_got = set() + + sources = [] + includes = [ + line + for line in source.split("\n") + if self._is_include_line(line) + ] + filenames = [ + filename.strip(' ') + for include in includes + for filename in include.split(' ')[1:] + if filename.strip(' ') + ] + + for filename in filenames: + if filename not in already_got: + with open(filename) as file: + include_source = file.read() + sources.append(include_source) + include_sources = self._get_included_sources_recursively( + include_source, already_got + ) + sources.extend(include_sources) + + already_got.add(filename) + + return sources + class BaseAction: do_skip = None diff --git a/tests/include.Bakefile b/tests/include.Bakefile new file mode 100644 index 0000000..53cc415 --- /dev/null +++ b/tests/include.Bakefile @@ -0,0 +1,3 @@ +include included1.Bakefile included2.Bakefile + +include: included1 included2 included3 diff --git a/tests/include.bats b/tests/include.bats new file mode 100755 index 0000000..7ad0855 --- /dev/null +++ b/tests/include.bats @@ -0,0 +1,24 @@ +#!/usr/bin/env bats +export BAKEFILE=include.Bakefile + +@test "test include first file" { + run bake --silent included1 + [[ "${lines[0]}" == "Included1" ]] +} + +@test "test include second file" { + run bake --silent included2 + [[ "${lines[0]}" == "Included2" ]] +} + +@test "test include of a included file" { + run bake --silent included3 + [[ "${lines[0]}" == "Included3" ]] +} + +@test "test task with dependencies as includes" { + run bake --silent include + [[ "${lines[0]}" == "Included1" ]] + [[ "${lines[1]}" == "Included2" ]] + [[ "${lines[2]}" == "Included3" ]] +} diff --git a/tests/included1.Bakefile b/tests/included1.Bakefile new file mode 100644 index 0000000..c89b5c7 --- /dev/null +++ b/tests/included1.Bakefile @@ -0,0 +1,2 @@ +included1: + echo Included1 diff --git a/tests/included2.Bakefile b/tests/included2.Bakefile new file mode 100644 index 0000000..8949d8f --- /dev/null +++ b/tests/included2.Bakefile @@ -0,0 +1,4 @@ +include included3.Bakefile + +included2: + echo Included2 diff --git a/tests/included3.Bakefile b/tests/included3.Bakefile new file mode 100644 index 0000000..2c9130a --- /dev/null +++ b/tests/included3.Bakefile @@ -0,0 +1,2 @@ +included3: + echo Included3