From 859b2f79487f648d61dbb1b4dc0c026e1f06baf6 Mon Sep 17 00:00:00 2001 From: Rene Moser Date: Fri, 11 Sep 2015 21:26:23 +0200 Subject: [PATCH] composer: smarter arguments handling To get all available options in json for each command, `composer help --format=json` can be used. This allows us to simply parse the output and dynamically find out if an option is available. Neat! --- .../extras/packaging/language/composer.py | 74 ++++++++++++------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/lib/ansible/modules/extras/packaging/language/composer.py b/lib/ansible/modules/extras/packaging/language/composer.py index 6d681c5ba2e..1ef93e736fc 100644 --- a/lib/ansible/modules/extras/packaging/language/composer.py +++ b/lib/ansible/modules/extras/packaging/language/composer.py @@ -22,7 +22,9 @@ DOCUMENTATION = ''' --- module: composer -author: "Dimitrios Tydeas Mengidis (@dmtrs)" +author: + - "Dimitrios Tydeas Mengidis (@dmtrs)" + - "René Moser (@resmo)" short_description: Dependency Manager for PHP version_added: "1.6" description: @@ -94,7 +96,7 @@ requirements: - php - composer installed in bin path (recommended /usr/local/bin) notes: - - Default options that are always appended in each execution are --no-ansi, --no-progress, and --no-interaction + - Default options that are always appended in each execution are --no-ansi, --no-interaction and --no-progress if available. ''' EXAMPLES = ''' @@ -105,12 +107,27 @@ EXAMPLES = ''' import os import re +try: + import json +except ImportError: + import simplejson as json + def parse_out(string): return re.sub("\s+", " ", string).strip() def has_changed(string): return "Nothing to install or update" not in string +def get_available_options(module, command='install'): + # get all availabe options from a composer command using composer help to json + rc, out, err = composer_command(module, "help %s --format=json" % command) + if rc != 0: + output = parse_out(err) + module.fail_json(msg=output) + + command_help_json = json.loads(out) + return command_help_json['definition']['options'] + def composer_command(module, command, options=[]): php_path = module.get_bin_path("php", True, ["/usr/local/bin"]) composer_path = module.get_bin_path("composer", True, ["/usr/local/bin"]) @@ -133,33 +150,40 @@ def main(): supports_check_mode=True ) + # Get composer command with fallback to default + command = module.params['command'] + available_options = get_available_options(module=module, command=command) + options = [] # Default options - options.append('--no-ansi') - options.append('--no-progress') - options.append('--no-interaction') + default_options = [ + 'no-ansi', + 'no-interaction', + 'no-progress', + ] - options.extend(['--working-dir', os.path.abspath(module.params['working_dir'])]) + for option in default_options: + if option in available_options: + option = "--%s" % option + options.append(option) - # Get composer command with fallback to default - command = module.params['command'] + options.extend(['--working-dir', os.path.abspath(module.params['working_dir'])]) - # Prepare options - if module.params['prefer_source']: - options.append('--prefer-source') - if module.params['prefer_dist']: - options.append('--prefer-dist') - if module.params['no_dev']: - options.append('--no-dev') - if module.params['no_scripts']: - options.append('--no-scripts') - if module.params['no_plugins']: - options.append('--no-plugins') - if module.params['optimize_autoloader']: - options.append('--optimize-autoloader') - if module.params['ignore_platform_reqs']: - options.append('--ignore-platform-reqs') + option_params = { + 'prefer_source': 'prefer-source', + 'prefer_dist': 'prefer-dist', + 'no_dev': 'no-dev', + 'no_scripts': 'no-scripts', + 'no_plugins': 'no_plugins', + 'optimize_autoloader': 'optimize-autoloader', + 'ignore_platform_reqs': 'ignore-platform-reqs', + } + + for param, option in option_params.iteritems(): + if module.params.get(param) and option in available_options: + option = "--%s" % option + options.append(option) if module.check_mode: options.append('--dry-run') @@ -176,5 +200,5 @@ def main(): # import module snippets from ansible.module_utils.basic import * - -main() +if __name__ == '__main__': + main()