from __future__ import (absolute_import, division, print_function) __metaclass__ = type import subprocess import os import json from ansible.errors import AnsibleError QB_ROOT = os.path.realpath( os.path.join( os.path.dirname(os.path.realpath(__file__)), # /plugins/filter_plugins '..', # /plugins '..', # / ) ) def semver_inc(version, level = None, preid = None): '''increment the version at level, with optional preid for pre- levels. runs semver --increment [--preid ] >>> semver_inc('1.0.0', 'minor', preid = 'dev') '1.0.1-dev.0' ''' cmd = [ os.path.join(QB_ROOT, 'node_modules', '.bin', 'semver'), '--increment', ] if not (level is None): cmd.append(level) if not (preid is None): cmd.append('--preid') cmd.append(preid) cmd.append(version) out = subprocess.check_output(cmd) return out.rstrip() def semver_parse(version): '''parse semver. ''' stmt = ( '''console.log(JSON.stringify(require('semver')(%s), null, 2))''' % json.dumps(version) ) cmd = ['node', '--eval', stmt] out = subprocess.check_output( cmd, cwd = os.path.realpath( os.path.join(__file__, '..', '..') ) ) version = json.loads(out) version['is_release'] = len(version['prerelease']) == 0 version['is_dev'] = ( len(version['prerelease']) > 0 and version['prerelease'][0] == 'dev' ) version['is_rc'] = ( len(version['prerelease']) > 0 and version['prerelease'][0] == 'rc' ) if version['is_release']: version['type'] = 'release' else: version['type'] = version['prerelease'][0] version['release'] = "%(major)s.%(minor)s.%(patch)s" % version return version class FilterModule(object): ''' version manipulation filters ''' def filters(self): return { 'semver_inc': semver_inc, 'semver_parse': semver_parse, } # testing - call camel_case on first cli arg and print result if __name__ == '__main__': import doctest doctest.testmod()