From e0d38fb137546ca8e16d6bcb1d2d98a101e98414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Moser?= Date: Tue, 7 Mar 2017 20:51:04 +0100 Subject: [PATCH] composer: fix escape working_dir (#22363) * composer: fix escaping of path working_dir * composer: fix pep8 --- .../modules/packaging/language/composer.py | 121 +++++++++--------- test/sanity/pep8/legacy-files.txt | 1 - 2 files changed, 60 insertions(+), 62 deletions(-) diff --git a/lib/ansible/modules/packaging/language/composer.py b/lib/ansible/modules/packaging/language/composer.py index 5b83215f356..34cfd235277 100644 --- a/lib/ansible/modules/packaging/language/composer.py +++ b/lib/ansible/modules/packaging/language/composer.py @@ -32,82 +32,87 @@ author: short_description: Dependency Manager for PHP version_added: "1.6" description: - - Composer is a tool for dependency management in PHP. It allows you to declare the dependent libraries your project needs and it will install them in your project for you + - > + Composer is a tool for dependency management in PHP. It allows you to + declare the dependent libraries your project needs and it will install + them in your project for you. options: command: version_added: "1.8" description: - - Composer command like "install", "update" and so on + - Composer command like "install", "update" and so on. required: false default: install arguments: version_added: "2.0" description: - - Composer arguments like required package, version and so on + - Composer arguments like required package, version and so on. required: false default: null working_dir: description: - - Directory of your project ( see --working-dir ) + - Directory of your project (see --working-dir). required: true default: null aliases: [ "working-dir" ] prefer_source: description: - - Forces installation from package sources when possible ( see --prefer-source ) + - Forces installation from package sources when possible (see --prefer-source). required: false - default: "no" - choices: [ "yes", "no" ] + default: false + choices: [ true, false] aliases: [ "prefer-source" ] prefer_dist: description: - - Forces installation from package dist even for dev versions ( see --prefer-dist ) + - Forces installation from package dist even for dev versions (see --prefer-dist). required: false - default: "no" - choices: [ "yes", "no" ] + default: false + choices: [ true, false] aliases: [ "prefer-dist" ] no_dev: description: - - Disables installation of require-dev packages ( see --no-dev ) + - Disables installation of require-dev packages (see --no-dev). required: false - default: "yes" - choices: [ "yes", "no" ] + default: true + choices: [ true, false] aliases: [ "no-dev" ] no_scripts: description: - - Skips the execution of all scripts defined in composer.json ( see --no-scripts ) + - Skips the execution of all scripts defined in composer.json (see --no-scripts). required: false - default: "no" - choices: [ "yes", "no" ] + default: false + choices: [ true, false] aliases: [ "no-scripts" ] no_plugins: description: - - Disables all plugins ( see --no-plugins ) + - Disables all plugins ( see --no-plugins ). required: false - default: "no" - choices: [ "yes", "no" ] + default: false + choices: [ true, false] aliases: [ "no-plugins" ] optimize_autoloader: description: - - Optimize autoloader during autoloader dump ( see --optimize-autoloader ). Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but can take a bit of time to run so it is currently not done by default. + - Optimize autoloader during autoloader dump (see --optimize-autoloader). + - Convert PSR-0/4 autoloading to classmap to get a faster autoloader. + - Recommended especially for production, but can take a bit of time to run so it is currently not done by default. required: false - default: "yes" - choices: [ "yes", "no" ] + default: true + choices: [ true, false] aliases: [ "optimize-autoloader" ] ignore_platform_reqs: version_added: "2.0" description: - Ignore php, hhvm, lib-* and ext-* requirements and force the installation even if the local machine does not fulfill these. required: false - default: "no" - choices: [ "yes", "no" ] + default: false + choices: [ true, false] aliases: [ "ignore-platform-reqs" ] 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-interaction and --no-progress if available. - - We received reports about issues on macOS if composer was installed by Homebrew. Please use the official install method to avoid it. + - We received reports about issues on macOS if composer was installed by Homebrew. Please use the official install method to avoid issues. ''' EXAMPLES = ''' @@ -129,25 +134,18 @@ EXAMPLES = ''' prefer_dist: yes ''' -import os import re - -try: - import json -except ImportError: - try: - import simplejson as json - except ImportError: - # Let snippet from module_utils/basic.py return a proper error in this case - pass +from ansible.module_utils.basic import AnsibleModule 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 available options from a composer command using composer help to json rc, out, err = composer_command(module, "help %s --format=json" % command) @@ -155,28 +153,30 @@ def get_available_options(module, command='install'): output = parse_out(err) module.fail_json(msg=output) - command_help_json = json.loads(out) + command_help_json = module.from_json(out) return command_help_json['definition']['options'] -def composer_command(module, command, arguments = "", options=[]): - php_path = module.get_bin_path("php", True, ["/usr/local/bin"]) + +def composer_command(module, command, arguments="", 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 %s" % (php_path, composer_path, command, " ".join(options), arguments) + cmd = "%s %s %s %s %s" % (php_path, composer_path, command, " ".join(options), arguments) return module.run_command(cmd) + def main(): module = AnsibleModule( - argument_spec = dict( - command = dict(default="install", type="str", required=False), - arguments = dict(default="", type="str", required=False), - working_dir = dict(aliases=["working-dir"], required=True), - prefer_source = dict(default="no", type="bool", aliases=["prefer-source"]), - prefer_dist = dict(default="no", type="bool", aliases=["prefer-dist"]), - no_dev = dict(default="yes", type="bool", aliases=["no-dev"]), - no_scripts = dict(default="no", type="bool", aliases=["no-scripts"]), - no_plugins = dict(default="no", type="bool", aliases=["no-plugins"]), - optimize_autoloader = dict(default="yes", type="bool", aliases=["optimize-autoloader"]), - ignore_platform_reqs = dict(default="no", type="bool", aliases=["ignore-platform-reqs"]), + argument_spec=dict( + command=dict(default="install", type="str", required=False), + arguments=dict(default="", type="str", required=False), + working_dir=dict(type="path", aliases=["working-dir"], required=True), + prefer_source=dict(default=False, type="bool", aliases=["prefer-source"]), + prefer_dist=dict(default=False, type="bool", aliases=["prefer-dist"]), + no_dev=dict(default=True, type="bool", aliases=["no-dev"]), + no_scripts=dict(default=False, type="bool", aliases=["no-scripts"]), + no_plugins=dict(default=False, type="bool", aliases=["no-plugins"]), + optimize_autoloader=dict(default=True, type="bool", aliases=["optimize-autoloader"]), + ignore_platform_reqs=dict(default=False, type="bool", aliases=["ignore-platform-reqs"]), ), supports_check_mode=True ) @@ -203,17 +203,17 @@ def main(): option = "--%s" % option options.append(option) - options.extend(['--working-dir', os.path.abspath(module.params['working_dir'])]) + options.extend(['--working-dir', "'%s'" % module.params['working_dir']]) 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', + '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.items(): if module.params.get(param) and option in available_options: @@ -231,9 +231,8 @@ def main(): else: # Composer version > 1.0.0-alpha9 now use stderr for standard notification messages output = parse_out(out + err) - module.exit_json(changed=has_changed(output), msg=output, stdout=out+err) + module.exit_json(changed=has_changed(output), msg=output, stdout=out + err) + -# import module snippets -from ansible.module_utils.basic import * if __name__ == '__main__': main() diff --git a/test/sanity/pep8/legacy-files.txt b/test/sanity/pep8/legacy-files.txt index f6efd53c2b7..7db2b170cfb 100644 --- a/test/sanity/pep8/legacy-files.txt +++ b/test/sanity/pep8/legacy-files.txt @@ -158,7 +158,6 @@ lib/ansible/modules/network/snmp_facts.py lib/ansible/modules/notification/hall.py lib/ansible/modules/notification/sendgrid.py lib/ansible/modules/notification/sns.py -lib/ansible/modules/packaging/language/composer.py lib/ansible/modules/packaging/language/maven_artifact.py lib/ansible/modules/packaging/os/apt.py lib/ansible/modules/packaging/os/apt_key.py