Browse Source

Add `source` to templates (#163)

A new variable is exposed to templates, which holds the filename of the
template source. The primary use case is to be able to include a warning
message within the template. For example:

  # Do not edit. This file auto-generated from {{ yadm.source }}.
Tim Byrne 5 years ago
parent
commit
aeb6a54ad7
4 changed files with 40 additions and 0 deletions
  1. 17 0
      test/test_unit_template_builtin.py
  2. 18 0
      test/test_unit_template_j2.py
  3. 4 0
      yadm
  4. 1 0
      yadm.1

+ 17 - 0
test/test_unit_template_builtin.py

@@ -106,3 +106,20 @@ def test_template_builtin(runner, yadm, tmpdir):
     assert run.success
     assert run.success
     assert run.err == ''
     assert run.err == ''
     assert output_file.read() == EXPECTED
     assert output_file.read() == EXPECTED
+
+
+def test_source(runner, yadm, tmpdir):
+    """Test yadm.source"""
+
+    input_file = tmpdir.join('input')
+    input_file.write('{{yadm.source}}', ensure=True)
+    output_file = tmpdir.join('output')
+
+    script = f"""
+        YADM_TEST=1 source {yadm}
+        template_builtin "{input_file}" "{output_file}"
+    """
+    run = runner(command=['bash'], inp=script)
+    assert run.success
+    assert run.err == ''
+    assert output_file.read().strip() == str(input_file)

+ 18 - 0
test/test_unit_template_j2.py

@@ -97,3 +97,21 @@ def test_template_j2(runner, yadm, tmpdir, processor):
     assert run.success
     assert run.success
     assert run.err == ''
     assert run.err == ''
     assert output_file.read() == EXPECTED
     assert output_file.read() == EXPECTED
+
+
+@pytest.mark.parametrize('processor', ('j2cli', 'envtpl'))
+def test_source(runner, yadm, tmpdir, processor):
+    """Test YADM_SOURCE"""
+
+    input_file = tmpdir.join('input')
+    input_file.write('{{YADM_SOURCE}}', ensure=True)
+    output_file = tmpdir.join('output')
+
+    script = f"""
+        YADM_TEST=1 source {yadm}
+        template_{processor} "{input_file}" "{output_file}"
+    """
+    run = runner(command=['bash'], inp=script)
+    assert run.success
+    assert run.err == ''
+    assert output_file.read().strip() == str(input_file)

+ 4 - 0
yadm

@@ -297,6 +297,7 @@ BEGIN {
   c["hostname"] = host
   c["hostname"] = host
   c["user"]     = user
   c["user"]     = user
   c["distro"]   = distro
   c["distro"]   = distro
+  c["source"]   = source
   vld           = conditions()
   vld           = conditions()
   ifs           = "^{%" blank "*if"
   ifs           = "^{%" blank "*if"
   els           = "^{%" blank "*else" blank "*%}$"
   els           = "^{%" blank "*else" blank "*%}$"
@@ -340,6 +341,7 @@ EOF
     -v host="$local_host" \
     -v host="$local_host" \
     -v user="$local_user" \
     -v user="$local_user" \
     -v distro="$local_distro" \
     -v distro="$local_distro" \
+    -v source="$input" \
     "$awk_pgm" \
     "$awk_pgm" \
     "$input" > "$output"
     "$input" > "$output"
 }
 }
@@ -353,6 +355,7 @@ function template_j2cli() {
   YADM_HOSTNAME="$local_host" \
   YADM_HOSTNAME="$local_host" \
   YADM_USER="$local_user"     \
   YADM_USER="$local_user"     \
   YADM_DISTRO="$local_distro" \
   YADM_DISTRO="$local_distro" \
+  YADM_SOURCE="$input"        \
   "$J2CLI_PROGRAM" "$input" -o "$output"
   "$J2CLI_PROGRAM" "$input" -o "$output"
 }
 }
 
 
@@ -365,6 +368,7 @@ function template_envtpl() {
   YADM_HOSTNAME="$local_host" \
   YADM_HOSTNAME="$local_host" \
   YADM_USER="$local_user"     \
   YADM_USER="$local_user"     \
   YADM_DISTRO="$local_distro" \
   YADM_DISTRO="$local_distro" \
+  YADM_SOURCE="$input"        \
   "$ENVTPL_PROGRAM" --keep-template "$input" -o "$output"
   "$ENVTPL_PROGRAM" --keep-template "$input" -o "$output"
 }
 }
 
 

+ 1 - 0
yadm.1

@@ -584,6 +584,7 @@ During processing, the following variables are available in the template:
  yadm.hostname   YADM_HOSTNAME   hostname (without domain)
  yadm.hostname   YADM_HOSTNAME   hostname (without domain)
  yadm.os         YADM_OS         uname -s
  yadm.os         YADM_OS         uname -s
  yadm.user       YADM_USER       id -u -n
  yadm.user       YADM_USER       id -u -n
+ yadm.source     YADM_SOURCE     Template filename
 
 
 Examples:
 Examples: