diff --git a/packaging/language/composer.py b/packaging/language/composer.py index 8e11d25216b..1ef93e736fc 100644 --- a/packaging/language/composer.py +++ b/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,20 +107,31 @@ 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): - if "Nothing to install or update" in string: - return False - else: - return True + 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) -def composer_install(module, command, options): + 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"]) cmd = "%s %s %s %s" % (php_path, composer_path, command, " ".join(options)) - return module.run_command(cmd) def main(): @@ -137,38 +150,45 @@ 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') - rc, out, err = composer_install(module, command, options) + rc, out, err = composer_command(module, command, options) if rc != 0: output = parse_out(err) @@ -180,5 +200,5 @@ def main(): # import module snippets from ansible.module_utils.basic import * - -main() +if __name__ == '__main__': + main()