Docs and macros improvements (#2084)
* Document builtin template filters * do not require explicit _has_error_case param for footer macro, but still allow it
This commit is contained in:
@@ -42,8 +42,8 @@ from {{ exercise | to_snake }} import ({% if imports -%}
|
|||||||
return self.assertRaisesRegex(exception, r".+")
|
return self.assertRaisesRegex(exception, r".+")
|
||||||
{%- endmacro %}
|
{%- endmacro %}
|
||||||
|
|
||||||
{% macro footer(has_error_case) -%}
|
{% macro footer(_has_error_case) -%}
|
||||||
{% if has_error_case %}
|
{% if has_error_case or _has_error_case %}
|
||||||
{{ utility() }}
|
{{ utility() }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -34,6 +34,12 @@ structure for the exercise you're working on, please consult
|
|||||||
error to be thrown (ex: `False`)
|
error to be thrown (ex: `False`)
|
||||||
- `additional_cases`: similar structure to `cases`, but is populated from the exercise's `.meta/additional_tests.json` file if one exists (for an example, see `exercises/word-count/.meta/additional_tests.json`)
|
- `additional_cases`: similar structure to `cases`, but is populated from the exercise's `.meta/additional_tests.json` file if one exists (for an example, see `exercises/word-count/.meta/additional_tests.json`)
|
||||||
|
|
||||||
|
Additionally, the following template filters are added for convenience:
|
||||||
|
- `to_snake`: Converts a string to snake_case (ex: `{{ "CamelCaseString" | to_snake }}` -> `camel_case_string`)
|
||||||
|
- `camel_case`: Converts a string to CamelCase (ex: `{{ "snake_case_string" | camel_case }}` -> `SnakeCaseString` )
|
||||||
|
- `error_case`: Checks if a test case expects an error to be thrown (ex: `{% for case in cases%}{% if case is error_case}`)
|
||||||
|
- `regex_replace`: Regex string replacement (ex: `{{ "abc123" | regex_replace("\\d", "D") }}` -> `abcDDD`)
|
||||||
|
|
||||||
### Conventions
|
### Conventions
|
||||||
|
|
||||||
- General-use macros for highly repeated template structures are defined in `config/generator_macros.j2`.
|
- General-use macros for highly repeated template structures are defined in `config/generator_macros.j2`.
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
{%- endif %}
|
{%- endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{{ macros.footer(has_error_case) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
{{ macros.footer(has_error_case) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -47,6 +47,16 @@ class HammingTest(unittest.TestCase):
|
|||||||
def assertRaisesWithMessage(self, exception):
|
def assertRaisesWithMessage(self, exception):
|
||||||
return self.assertRaisesRegex(exception, r".+")
|
return self.assertRaisesRegex(exception, r".+")
|
||||||
|
|
||||||
|
# Utility functions
|
||||||
|
def setUp(self):
|
||||||
|
try:
|
||||||
|
self.assertRaisesRegex
|
||||||
|
except AttributeError:
|
||||||
|
self.assertRaisesRegex = self.assertRaisesRegexp
|
||||||
|
|
||||||
|
def assertRaisesWithMessage(self, exception):
|
||||||
|
return self.assertRaisesRegex(exception, r".+")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -21,4 +21,4 @@ class {{ case["description"] | camel_case }}Test(unittest.TestCase):
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{{ macros.footer(has_error_case) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -15,4 +15,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{{ macros.footer(has_error_case) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -27,4 +27,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
{{ macros.footer(True) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -77,16 +77,6 @@ class ScaleGeneratorTest(unittest.TestCase):
|
|||||||
expected = ["G", "G#", "B", "C#", "D#", "F", "F#"]
|
expected = ["G", "G#", "B", "C#", "D#", "F", "F#"]
|
||||||
self.assertEqual(Scale("G").interval("mAMMMmm"), expected)
|
self.assertEqual(Scale("G").interval("mAMMMmm"), expected)
|
||||||
|
|
||||||
# Utility functions
|
|
||||||
def setUp(self):
|
|
||||||
try:
|
|
||||||
self.assertRaisesRegex
|
|
||||||
except AttributeError:
|
|
||||||
self.assertRaisesRegex = self.assertRaisesRegexp
|
|
||||||
|
|
||||||
def assertRaisesWithMessage(self, exception):
|
|
||||||
return self.assertRaisesRegex(exception, r".+")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
self.assertEqual({{ case["property"] }}("{{ input["series"] }}", {{ input["sliceLength"] }}), {{ case["expected"] }})
|
self.assertEqual({{ case["property"] }}("{{ input["series"] }}", {{ input["sliceLength"] }}), {{ case["expected"] }})
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{{ macros.footer(True) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -44,4 +44,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
{{ test_case(case) }}
|
{{ test_case(case) }}
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
|
|
||||||
{{ macros.footer(True) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -24,4 +24,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{{ macros.footer(has_error_case) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
|
|||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
|
|
||||||
{{ macros.footer(has_error_case) }}
|
{{ macros.footer() }}
|
||||||
|
|||||||
Reference in New Issue
Block a user