Skip to content

Commit

Permalink
Merge pull request #146 from CLiu13/low-setup-usage
Browse files Browse the repository at this point in the history
✨ Add low-setup usage
  • Loading branch information
chfw authored Jan 4, 2019
2 parents e0880fb + d9e98b8 commit bb1eb42
Show file tree
Hide file tree
Showing 14 changed files with 146 additions and 27 deletions.
6 changes: 6 additions & 0 deletions .moban.cd/changelog.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
name: moban
organisation: moremoban
releases:
- changes:
- action: Updated
details:
- "`#146`: added a low-setup usage mode via environment variables to moban"
date: 3-1-2019
version: 0.3.7
- changes:
- action: Updated
details:
Expand Down
6 changes: 3 additions & 3 deletions .moban.cd/moban.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ organisation: moremoban
author: C. W.
contact: wangc_2011@hotmail.com
license: MIT
version: 0.3.6
current_version: 0.3.6
release: 0.3.6
version: 0.3.7
current_version: 0.3.7
release: 0.3.7
branch: master
command_line_interface: "moban"
entry_point: "moban.main:main"
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
Change log
================================================================================

0.3.7 - 3-1-2019
--------------------------------------------------------------------------------

Updated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#. `#146 <https://github.com/moremoban/moban/issues/146>`_: added a low-setup
usage mode via environment variables to moban

0.3.6 - 30-12-2018
--------------------------------------------------------------------------------

Expand Down
6 changes: 4 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,13 @@ Usage
-cd CONFIGURATION_DIR, --configuration_dir CONFIGURATION_DIR
the directory for configuration file lookup
-c CONFIGURATION, --configuration CONFIGURATION
the dictionary file
the dictionary file. if not present, moban
will try to use environment vars as data
-td [TEMPLATE_DIR [TEMPLATE_DIR ...]], --template_dir [TEMPLATE_DIR [TEMPLATE_DIR ...]]
the directories for template file lookup
-t TEMPLATE, --template TEMPLATE
the template file
the template file. this overrides any targets
defined in a custom moban file
-o OUTPUT, --output OUTPUT
the output file
--template_type TEMPLATE_TYPE
Expand Down
4 changes: 2 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
author = u'C. W.'

# The short X.Y version
version = u'0.3.6'
version = u'0.3.7'
# The full version, including alpha/beta/rc tags
release = u'0.3.6'
release = u'0.3.7'


# -- General configuration ---------------------------------------------------
Expand Down
3 changes: 2 additions & 1 deletion docs/level-1-jinja2-cli/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ Level 1 Jinja2 on command line
================================================================================

`moban` reads data in yaml format, renders a template file in jinja2 format and
outputs it to `moban.output`. By default, it looks for `data.yml` as its data file
outputs it to `moban.output`. By default, it looks for `data.yml` as its data file,
but it will fallback to environment variables if a data file cannot be found

Evaluation
--------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion moban/_version.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
__version__ = "0.3.6"
__version__ = "0.3.7"
__author__ = "C. W."
28 changes: 23 additions & 5 deletions moban/mobanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,23 @@ def find_default_moban_file():

def handle_moban_file_v1(moban_file_configurations, command_line_options):
merged_options = None
target = extract_target(command_line_options)

targets = moban_file_configurations.get(constants.LABEL_TARGETS)
try:
target = extract_target(command_line_options)
except Exception as exception:
if targets:
template = command_line_options.get(constants.LABEL_TEMPLATE)
for t in targets:
found_template = template in t.values()
if found_template:
target = [dict(t)]
if not found_template:
# Warn user if template not defined under targets in moban file
reporter.report_template_not_in_moban_file(template)
else:
raise exception

if constants.LABEL_CONFIG in moban_file_configurations:
merged_options = merge(
command_line_options,
Expand All @@ -52,12 +68,14 @@ def handle_moban_file_v1(moban_file_configurations, command_line_options):
if requires:
handle_requires(requires)

targets = moban_file_configurations.get(constants.LABEL_TARGETS)
if targets:
# If template specified via CLI flag `-t:
# 1. Only update the specified template
# 2. Do not copy
if target:
# if command line option exists, append its template to targets
# issue 30
targets += target
targets = target
if constants.LABEL_COPY in moban_file_configurations:
del moban_file_configurations[constants.LABEL_COPY]
number_of_templated_files = handle_targets(merged_options, targets)
else:
number_of_templated_files = 0
Expand Down
30 changes: 27 additions & 3 deletions moban/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,15 @@ def number_of_templated_files(self):
return self.templated_count

def render_to_file(self, template_file, data_file, output_file):
data = self.context.get_data(data_file)
try:
data = self.context.get_data(data_file)
except Exception as exception:
# If data file doesn't exist:
# 1. Alert the user of their (potential) mistake
# 2. Attempt to use environment vars as data
reporter.report_error_message(str(exception))
reporter.report_using_env_vars()
data = os.environ
template = self.engine.get_template(template_file)
template_abs_path = utils.get_template_path(
self.template_dirs, template_file
Expand Down Expand Up @@ -89,7 +97,15 @@ def _render_with_finding_template_first(self, template_file_index):
self.template_dirs, template_file
)
for (data_file, output) in data_output_pairs:
data = self.context.get_data(data_file)
try:
data = self.context.get_data(data_file)
except Exception as exception:
# If data file doesn't exist:
# 1. Alert the user of their (potential) mistake
# 2. Attempt to use environment vars as data
reporter.report_error_message(exception)
reporter.report_using_env_vars()
data = os.environ
flag = self.apply_template(
template_abs_path, template, data, output
)
Expand All @@ -100,7 +116,15 @@ def _render_with_finding_template_first(self, template_file_index):

def _render_with_finding_data_first(self, data_file_index):
for (data_file, template_output_pairs) in data_file_index.items():
data = self.context.get_data(data_file)
try:
data = self.context.get_data(data_file)
except Exception as exception:
# If data file doesn't exist:
# 1. Alert the user of their (potential) mistake
# 2. Attempt to use environment vars as data
reporter.report_error_message(exception)
reporter.report_using_env_vars()
data = os.environ
for (template_file, output) in template_output_pairs:
template = self.engine.get_template(template_file)
template_abs_path = utils.get_template_path(
Expand Down
11 changes: 11 additions & 0 deletions moban/reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
MESSAGE_COPIED_ALL = "Copied {0} files."
MESSAGE_PULLING_REPO = "Updating {0}..."
MESSAGE_CLONING_REPO = "Cloning {0}..."
MESSAGE_USING_ENV_VARS = "Attempting to use environment vars as data..."
MESSAGE_TEMPLATE_NOT_IN_MOBAN_FILE = "{0} is not defined in your moban file!"


def report_templating(source_file, destination_file):
Expand Down Expand Up @@ -89,6 +91,15 @@ def report_git_clone(repo):
print(MESSAGE_CLONING_REPO.format(colored_repo))


def report_using_env_vars():
print(crayons.yellow(MESSAGE_USING_ENV_VARS, bold=True))


def report_template_not_in_moban_file(template):
message = MESSAGE_TEMPLATE_NOT_IN_MOBAN_FILE.format(template)
print(crayons.yellow(message, bold=True))


def _format_single(message, count):
if count == 1:
return message.replace("files", "file")
Expand Down
8 changes: 4 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

NAME = 'moban'
AUTHOR = 'C. W.'
VERSION = '0.3.6'
VERSION = '0.3.7'
EMAIL = 'wangc_2011@hotmail.com'
LICENSE = 'MIT'
ENTRY_POINTS = {
Expand All @@ -25,7 +25,7 @@
'Yet another jinja2 cli command for static text generation'
)
URL = 'https://github.com/moremoban/moban'
DOWNLOAD_URL = '%s/archive/0.3.6.tar.gz' % URL
DOWNLOAD_URL = '%s/archive/0.3.7.tar.gz' % URL
FILES = ['README.rst', 'CONTRIBUTORS.rst', 'CHANGELOG.rst']
KEYWORDS = [
'python',
Expand Down Expand Up @@ -60,8 +60,8 @@
# You do not need to read beyond this line
PUBLISH_COMMAND = '{0} setup.py sdist bdist_wheel upload -r pypi'.format(
sys.executable)
GS_COMMAND = ('gs moban v0.3.6 ' +
"Find 0.3.6 in changelog for more details")
GS_COMMAND = ('gs moban v0.3.7 ' +
"Find 0.3.7 in changelog for more details")
NO_GS_MESSAGE = ('Automatic github release is disabled. ' +
'Please install gease to enable it.')
UPLOAD_FAILED_MSG = (
Expand Down
1 change: 1 addition & 0 deletions tests/fixtures/environ_vars_as_data/test.template
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{ TEST_ENVIRONMENT_VARIABLE }}
45 changes: 39 additions & 6 deletions tests/integration_tests/test_command_line_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def tearDown(self):
os.unlink(self.config_file)


@raises(IOError)
@raises(Exception)
def test_missing_configuration():
test_args = ["moban", "-t", "a.jj2"]
with patch.object(sys, "argv", test_args):
Expand Down Expand Up @@ -146,8 +146,6 @@ def test_single_command_with_a_few_options(self, fake_template_doer):
eq_(
call_args,
[
("README.rst.jj2", "data.yaml", "README.rst"),
("setup.py.jj2", "data.yaml", "setup.py"),
("abc.jj2", "data.yaml", "xyz.output"),
],
)
Expand All @@ -171,14 +169,11 @@ def test_single_command_with_options(self, fake_template_doer):
eq_(
call_args,
[
("README.rst.jj2", "new.yml", "README.rst"),
("setup.py.jj2", "new.yml", "setup.py"),
("abc.jj2", "new.yml", "xyz.output"),
],
)

@raises(Exception)
@patch("moban.plugins.BaseEngine.render_to_files")
def test_single_command_without_output_option(self, fake_template_doer):
test_args = ["moban", "-t", "abc.jj2"]
with patch.object(sys, "argv", test_args):
Expand Down Expand Up @@ -265,6 +260,44 @@ def tearDown(self):
os.unlink(self.data_file)


class TestTemplateOption:
def setUp(self):
self.config_file = "custom-moban.txt"
copyfile(
os.path.join("tests", "fixtures", ".moban.yml"), self.config_file
)
self.patcher1 = patch(
"moban.plugins.verify_the_existence_of_directories"
)
self.patcher1.start()

@patch("moban.plugins.BaseEngine.render_to_file")
def test_template_option_override_moban_file(self, fake_template_doer):
test_args = ["moban", "-t", "setup.py.jj2"]
with patch.object(sys, "argv", test_args):
from moban.main import main

main()
fake_template_doer.assert_called_with(
"setup.py.jj2", "data.yml", "moban.output"
)

@patch("moban.plugins.BaseEngine.render_to_file")
def test_template_option_not_in_moban_file(self, fake_template_doer):
test_args = ["moban", "-t", "foo.jj2"]
with patch.object(sys, "argv", test_args):
from moban.main import main

main()
fake_template_doer.assert_called_with(
"foo.jj2", "data.yml", "moban.output"
)

def tearDown(self):
self.patcher1.stop()
os.unlink(self.config_file)


@patch("moban.plugins.verify_the_existence_of_directories")
def test_duplicated_targets_in_moban_file(fake_verify):
config_file = "duplicated.moban.yml"
Expand Down
14 changes: 14 additions & 0 deletions tests/test_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,17 @@ def test_nested_global_template_variables():
content = output_file.read()
eq_(content, "template: nested.template\ntarget: test.txt\nhere")
os.unlink(output)


def test_environ_variables_as_data():
test_var = "TEST_ENVIRONMENT_VARIABLE"
test_value = "foo"
os.environ[test_var] = test_value
output = "test.txt"
path = os.path.join("tests", "fixtures", "environ_vars_as_data")
engine = BaseEngine([path], path, Engine)
engine.render_to_file("test.template", "this_does_not_exist.yml", output)
with open(output, "r") as output_file:
content = output_file.read()
eq_(content, "foo")
os.unlink(output)

0 comments on commit bb1eb42

Please sign in to comment.