60603c3213
This implements more correct file open options. While this is not strictly required it does appear to make the script behave more consistently across different platforms. The patch also renames the file name and related content to ensure that the tool is correctly spelled. Change-Id: Idde0141691e1008bead802bd6f3759c12e37b02b
105 lines
2.9 KiB
Python
Executable File
105 lines
2.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Copyright 2016, Rackspace US, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# (c) 2016, Jesse Pretorius <jesse.pretorius@rackspace.co.uk>
|
|
#
|
|
|
|
|
|
"""Read/write ansible-role-requirements.yml content from the CLI."""
|
|
|
|
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import yaml
|
|
|
|
|
|
# To ensure that the dicts are always output in the same order
|
|
# we setup a representation for dict objects and register it
|
|
# with the yaml class.
|
|
def represent_dict(self, data):
|
|
def key_function((key, value)):
|
|
# Prioritizes certain keys when sorting.
|
|
prio = {"model": 0, "pk": 1, "fields": 2}.get(key, 99)
|
|
return (prio, key)
|
|
items = data.items()
|
|
items.sort(key=key_function)
|
|
return self.represent_mapping(u'tag:yaml.org,2002:map', items)
|
|
|
|
yaml.add_representer(dict, represent_dict)
|
|
|
|
|
|
def main():
|
|
"""Run the main application."""
|
|
|
|
# Setup argument parsing
|
|
parser = argparse.ArgumentParser(
|
|
description='ansible-role-requirements.yml CLI editor',
|
|
epilog='Licensed "Apache 2.0"')
|
|
|
|
parser.add_argument(
|
|
'-f',
|
|
'--file',
|
|
help='<Required> ansible-role-requirements.yml file location',
|
|
required=True
|
|
)
|
|
|
|
parser.add_argument(
|
|
'-n',
|
|
'--name',
|
|
help='<Required> The name of the Ansible role to edit',
|
|
required=True
|
|
)
|
|
|
|
parser.add_argument(
|
|
'-v',
|
|
'--version',
|
|
help='<Required> The version to set for the Ansible role',
|
|
required=True
|
|
)
|
|
|
|
parser.add_argument(
|
|
'-s',
|
|
'--src',
|
|
help='<Optional> The source URL to set for the Ansible role',
|
|
required=False
|
|
)
|
|
|
|
# Parse arguments
|
|
args = parser.parse_args()
|
|
|
|
# Read the ansible-role-requirements.yml file into memory
|
|
with open(args.file, "r") as role_req_file:
|
|
reqs = yaml.safe_load(role_req_file)
|
|
|
|
# Loop through the list to find the applicable role
|
|
for role_data in reqs:
|
|
if role_data['name'] == args.name:
|
|
# Change the specified role data
|
|
role_data['version'] = args.version
|
|
if args.src:
|
|
role_data['src'] = args.src
|
|
|
|
# Write out the resulting file
|
|
with open(args.file, "w") as role_req_file:
|
|
try:
|
|
yaml.dump(reqs, role_req_file, default_flow_style=False)
|
|
except yaml.YAMLError as exc:
|
|
print(exc)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|