From 468e71bf718b3270af692bde186ef30a2ab62738 Mon Sep 17 00:00:00 2001 From: pari- Date: Mon, 28 Aug 2017 23:26:01 +0200 Subject: [PATCH] npm: fix idempotence (#22238) * npm: fix idempotence * Better idempotency fix More intelligently add --production rather than depending on hard coded order in args list Cleanup boilderplate imports and license PEP8 fixes --- lib/ansible/modules/packaging/language/npm.py | 36 ++++++++++++------- test/sanity/pep8/legacy-files.txt | 1 - 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/ansible/modules/packaging/language/npm.py b/lib/ansible/modules/packaging/language/npm.py index c399d83060..8cc9edbf76 100644 --- a/lib/ansible/modules/packaging/language/npm.py +++ b/lib/ansible/modules/packaging/language/npm.py @@ -1,16 +1,17 @@ #!/usr/bin/python # -*- coding: utf-8 -*- - -# (c) 2013, Chris Hoffman +# Copyright (c) 2017 Chris Hoffman # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} +ANSIBLE_METADATA = { + 'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community' +} DOCUMENTATION = ''' @@ -115,12 +116,20 @@ EXAMPLES = ''' state: present ''' -import json import os import re from ansible.module_utils.basic import AnsibleModule +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 + class Npm(object): def __init__(self, module, **kwargs): @@ -132,13 +141,14 @@ class Npm(object): self.registry = kwargs['registry'] self.production = kwargs['production'] self.ignore_scripts = kwargs['ignore_scripts'] + self.state = kwargs['state'] if kwargs['executable']: self.executable = kwargs['executable'].split(' ') else: self.executable = [module.get_bin_path('npm', True)] - if kwargs['version']: + if kwargs['version'] and self.state != 'absent': self.name_version = self.name + '@' + str(self.version) else: self.name_version = self.name @@ -149,7 +159,7 @@ class Npm(object): if self.glbl: cmd.append('--global') - if self.production: + if self.production and ('install' in cmd or 'update' in cmd): cmd.append('--production') if self.ignore_scripts: cmd.append('--ignore-scripts') @@ -159,7 +169,7 @@ class Npm(object): cmd.append('--registry') cmd.append(self.registry) - #If path is specified, cd into that path and run the command. + # If path is specified, cd into that path and run the command. cwd = None if self.path: if not os.path.exists(self.path): @@ -188,7 +198,7 @@ class Npm(object): installed.append(dep) if self.name and self.name not in installed: missing.append(self.name) - #Named dependency not installed + # Named dependency not installed else: missing.append(self.name) @@ -248,8 +258,8 @@ def main(): if state == 'absent' and not name: module.fail_json(msg='uninstalling a package is only available for named packages') - npm = Npm(module, name=name, path=path, version=version, glbl=glbl, production=production, \ - executable=executable, registry=registry, ignore_scripts=ignore_scripts) + npm = Npm(module, name=name, path=path, version=version, glbl=glbl, production=production, + executable=executable, registry=registry, ignore_scripts=ignore_scripts, state=state) changed = False if state == 'present': @@ -266,7 +276,7 @@ def main(): if len(outdated): changed = True npm.update() - else: #absent + else: # absent installed, missing = npm.list() if name in installed: changed = True diff --git a/test/sanity/pep8/legacy-files.txt b/test/sanity/pep8/legacy-files.txt index a30a02b058..52afef708b 100644 --- a/test/sanity/pep8/legacy-files.txt +++ b/test/sanity/pep8/legacy-files.txt @@ -368,7 +368,6 @@ lib/ansible/modules/packaging/language/cpanm.py lib/ansible/modules/packaging/language/easy_install.py lib/ansible/modules/packaging/language/gem.py lib/ansible/modules/packaging/language/maven_artifact.py -lib/ansible/modules/packaging/language/npm.py lib/ansible/modules/packaging/language/pear.py lib/ansible/modules/packaging/language/pip.py lib/ansible/modules/packaging/os/apk.py