summaryrefslogtreecommitdiff
path: root/openstackclient/common
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-02-07 18:07:54 +0000
committerGerrit Code Review <review@openstack.org>2015-02-07 18:07:54 +0000
commit6525c065a4e5ee0ff9ea3137a9ee57d58beb5cd5 (patch)
tree7f8d8dfd445344e5a2f38e54f509de92250b9750 /openstackclient/common
parentee98cb983a9b03d92a64127cbf15e20dc2fce2f1 (diff)
parent42cff388349186b70559650237d2667da1cb903f (diff)
downloadpython-openstackclient-6525c065a4e5ee0ff9ea3137a9ee57d58beb5cd5.tar.gz
Merge "Add sort support to image list"
Diffstat (limited to 'openstackclient/common')
-rw-r--r--openstackclient/common/utils.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py
index 9ad3823c..01a40e74 100644
--- a/openstackclient/common/utils.py
+++ b/openstackclient/common/utils.py
@@ -122,6 +122,17 @@ def format_list(data):
return ', '.join(sorted(data))
+def get_field(item, field):
+ try:
+ if isinstance(item, dict):
+ return item[field]
+ else:
+ return getattr(item, field)
+ except Exception:
+ msg = "Resource doesn't have field %s" % field
+ raise exceptions.CommandError(msg)
+
+
def get_item_properties(item, fields, mixed_case_fields=[], formatters={}):
"""Return a tuple containing the item properties.
@@ -170,6 +181,35 @@ def get_dict_properties(item, fields, mixed_case_fields=[], formatters={}):
return tuple(row)
+def sort_items(items, sort_str):
+ """Sort items based on sort keys and sort directions given by sort_str.
+
+ :param items: a list or generator object of items
+ :param sort_str: a string defining the sort rules, the format is
+ '<key1>:[direction1],<key2>:[direction2]...', direction can be 'asc'
+ for ascending or 'desc' for descending, if direction is not given,
+ it's ascending by default
+ :return: sorted items
+ """
+ if not sort_str:
+ return items
+ # items may be a generator object, transform it to a list
+ items = list(items)
+ sort_keys = sort_str.strip().split(',')
+ for sort_key in reversed(sort_keys):
+ reverse = False
+ if ':' in sort_key:
+ sort_key, direction = sort_key.split(':', 1)
+ if direction not in ['asc', 'desc']:
+ msg = "Specify sort direction by asc or desc"
+ raise exceptions.CommandError(msg)
+ if direction == 'desc':
+ reverse = True
+ items.sort(key=lambda item: get_field(item, sort_key),
+ reverse=reverse)
+ return items
+
+
def string_to_bool(arg):
return arg.strip().lower() in ('t', 'true', 'yes', '1')