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
This commit is contained in:
pari- 2017-08-28 23:26:01 +02:00 committed by Sam Doran
parent f9b3f4f934
commit 468e71bf71
2 changed files with 23 additions and 14 deletions

View file

@ -1,16 +1,17 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# (c) 2013, Chris Hoffman <christopher.hoffman@gmail.com>
# Copyright (c) 2017 Chris Hoffman <christopher.hoffman@gmail.com>
# 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

View file

@ -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