From 11a6465965af445f2cc2b8eaf91caaa2860b935c Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Wed, 18 Jan 2017 10:04:09 -0500 Subject: Adding tox tests for generated code. --- setup.py | 44 +++++++++++++++++++++++++++++++++++++++++++- tox.ini | 1 + 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c826c167f..597782db2 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ from __future__ import print_function import os import fnmatch import re - +import subprocess import yaml # Always prefer setuptools over distutils @@ -146,6 +146,47 @@ class OpenShiftAnsiblePylint(PylintCommand): return func(*func_args, **func_kwargs) +class OpenShiftAnsibleGenerateValidation(Command): + ''' Command to run generated module validation''' + description = "Run generated module validation" + user_options = [] + + def initialize_options(self): + ''' initialize_options ''' + pass + + def finalize_options(self): + ''' finalize_options ''' + pass + + # self isn't used but I believe is required when it is called. + # pylint: disable=no-self-use + def run(self): + ''' run command ''' + # find the files that call generate + generate_files = find_files('roles', + ['inventory', + 'test', + 'playbooks', + 'utils'], + None, + 'generate.py') + + # call them with --verify + errors = False + for gen in generate_files: + print('Checking generated module code: {0}'.format(gen)) + try: + subprocess.call([gen, '--verify']) + except subprocess.CalledProcessError as cpe: + print(cpe) + errors = True + + if errors: + print('Found errors while generating module code.') + raise SystemExit(1) + + class UnsupportedCommand(Command): ''' Basic Command to override unsupported commands ''' user_options = [] @@ -188,6 +229,7 @@ setup( 'sdist': UnsupportedCommand, 'lint': OpenShiftAnsiblePylint, 'yamllint': OpenShiftAnsibleYamlLint, + 'generate_validation': OpenShiftAnsibleGenerateValidation, }, packages=[], ) diff --git a/tox.ini b/tox.ini index 158974fbe..1e076c50d 100644 --- a/tox.ini +++ b/tox.ini @@ -16,3 +16,4 @@ commands = pylint: python setup.py lint yamllint: python setup.py yamllint unit: nosetests + generate_validation: python setup.py generate_validation -- cgit v1.2.3 From b6576d28ec21411f8da58cedab7a6c6c57dc172b Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Wed, 18 Jan 2017 14:49:15 -0500 Subject: Updated the generate.py scripts for tox and virtualenv. --- roles/lib_openshift/src/generate.py | 30 +++++++++++++++++++----------- roles/lib_utils/library/yedit.py | 6 ++++++ roles/lib_utils/src/generate.py | 32 ++++++++++++++++++++------------ setup.py | 22 ++++++++++++++++------ tox.ini | 2 +- 5 files changed, 62 insertions(+), 30 deletions(-) diff --git a/roles/lib_openshift/src/generate.py b/roles/lib_openshift/src/generate.py index 8451d99ab..6daade108 100755 --- a/roles/lib_openshift/src/generate.py +++ b/roles/lib_openshift/src/generate.py @@ -10,6 +10,7 @@ import six OPENSHIFT_ANSIBLE_PATH = os.path.dirname(os.path.realpath(__file__)) OPENSHIFT_ANSIBLE_SOURCES_PATH = os.path.join(OPENSHIFT_ANSIBLE_PATH, 'sources.yml') # noqa: E501 +LIBRARY = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/') class GenerateAnsibleException(Exception): @@ -42,22 +43,29 @@ def generate(parts): return data -def main(): - ''' combine the necessary files to create the ansible module ''' - args = parse_args() +def get_sources(): + '''return the path to the generate sources''' + return yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read()) - library = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/') - sources = yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read()) - for fname, parts in sources.items(): +def verify(): + '''verify if the generated code matches the library code''' + for fname, parts in get_sources().items(): data = generate(parts) - fname = os.path.join(library, fname) - if args.verify: - if not open(fname).read() == data.getvalue(): - raise GenerateAnsibleException('Generated content does not match for %s' % fname) + fname = os.path.join(LIBRARY, fname) + if not open(fname).read() == data.getvalue(): + raise GenerateAnsibleException('Generated content does not match for %s' % fname) + - continue +def main(): + ''' combine the necessary files to create the ansible module ''' + args = parse_args() + if args.verify: + verify() + for fname, parts in get_sources().items(): + data = generate(parts) + fname = os.path.join(LIBRARY, fname) with open(fname, 'w') as afd: afd.seek(0) afd.write(data.getvalue()) diff --git a/roles/lib_utils/library/yedit.py b/roles/lib_utils/library/yedit.py index d882c983e..6a5b40dcc 100644 --- a/roles/lib_utils/library/yedit.py +++ b/roles/lib_utils/library/yedit.py @@ -134,6 +134,12 @@ options: required: false default: true aliases: [] + separator: + description: + - The separator being used when parsing strings. + required: false + default: '.' + aliases: [] author: - "Kenny Woodson " extends_documentation_fragment: [] diff --git a/roles/lib_utils/src/generate.py b/roles/lib_utils/src/generate.py index cece68fb4..6daade108 100755 --- a/roles/lib_utils/src/generate.py +++ b/roles/lib_utils/src/generate.py @@ -5,11 +5,12 @@ import argparse import os -import six import yaml +import six OPENSHIFT_ANSIBLE_PATH = os.path.dirname(os.path.realpath(__file__)) OPENSHIFT_ANSIBLE_SOURCES_PATH = os.path.join(OPENSHIFT_ANSIBLE_PATH, 'sources.yml') # noqa: E501 +LIBRARY = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/') class GenerateAnsibleException(Exception): @@ -42,22 +43,29 @@ def generate(parts): return data -def main(): - ''' combine the necessary files to create the ansible module ''' - args = parse_args() +def get_sources(): + '''return the path to the generate sources''' + return yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read()) - library = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/') - sources = yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read()) - for fname, parts in sources.items(): +def verify(): + '''verify if the generated code matches the library code''' + for fname, parts in get_sources().items(): data = generate(parts) - fname = os.path.join(library, fname) - if args.verify: - if not open(fname).read() == data.getvalue(): - raise GenerateAnsibleException('Generated content does not match for %s' % fname) + fname = os.path.join(LIBRARY, fname) + if not open(fname).read() == data.getvalue(): + raise GenerateAnsibleException('Generated content does not match for %s' % fname) - continue +def main(): + ''' combine the necessary files to create the ansible module ''' + args = parse_args() + if args.verify: + verify() + + for fname, parts in get_sources().items(): + data = generate(parts) + fname = os.path.join(LIBRARY, fname) with open(fname, 'w') as afd: afd.seek(0) afd.write(data.getvalue()) diff --git a/setup.py b/setup.py index 597782db2..372aca9ff 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ from __future__ import print_function import os import fnmatch import re -import subprocess +import sys import yaml # Always prefer setuptools over distutils @@ -170,22 +170,32 @@ class OpenShiftAnsibleGenerateValidation(Command): 'playbooks', 'utils'], None, - 'generate.py') + 'generate.py$') + + if len(generate_files) < 1: + print('Did not find any code generation. Please verify module code generation.') # noqa: E501 + raise SystemExit(1) - # call them with --verify errors = False for gen in generate_files: print('Checking generated module code: {0}'.format(gen)) try: - subprocess.call([gen, '--verify']) - except subprocess.CalledProcessError as cpe: - print(cpe) + sys.path.insert(0, os.path.dirname(gen)) + # we are importing dynamically. This isn't in + # the python path. + # pylint: disable=import-error + import generate + generate.verify() + except generate.GenerateAnsibleException as gae: + print(gae.args) errors = True if errors: print('Found errors while generating module code.') raise SystemExit(1) + print('\nAll generate scripts passed.\n') + class UnsupportedCommand(Command): ''' Basic Command to override unsupported commands ''' diff --git a/tox.ini b/tox.ini index 1e076c50d..4d3594023 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] minversion=2.3.1 envlist = - py{27,35}-ansible22-{pylint,unit,flake8,yamllint} + py{27,35}-ansible22-{pylint,unit,flake8,yamllint,generate_validation} skipsdist=True skip_missing_interpreters=True -- cgit v1.2.3