blob: 689a1687f57f57f4ad3406b92e5ea236eec102fb [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE.txt file distributed with this work for
# additional information regarding copyright ownership. The ASF licenses this
# file to you 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.
SKIP_ATTRS = %w(metadata uri type)
INDEX_COL_WIDTH = 2
def format_response(response)
if response.multiple_entities? && response.collection.size > 1
format_collection response.collection
else
format_entity response.entity
end
end
def col_overhead
$settings.table_border? ? 3 : 1
end
def format_collection(collection, headers=nil)
if collection && collection.size > 0
save_headers = headers ? headers.clone : nil
save_response collection.response
metadata = collection_metadata collection, headers
table border: $settings.table_border? do
row header: true do
headers ||= metadata.keys
column '#', width: INDEX_COL_WIDTH
headers.each {|header| column header, width: metadata[header][:size] }
end
collection.each_with_index do |entity, index|
row do
column index+1
if entity.is_a? Array
entity.each {|v| column v }
else
headers.each {|header| column entity[header]}
end
end
end
end
if collection.cursor && agree('Next Page? (Y/N)') {|q| q.default = 'Y'}
format_collection(collection.next_page, save_headers)
end
else
puts "0 results"
end
end
def format_entity(entity)
if entity
name_cols = value_cols = 0
entity.data.reject{|k,v| SKIP_ATTRS.include? k}.each do |k,v|
name_cols = [name_cols, k.size].max
value_cols = [value_cols, v.to_s.size].max
end
table border: $settings.table_border? do
row header: true do
name_width = [name_cols, 20].min
column 'name', width: name_width
column 'value', width: [value_cols, HighLine.new.output_cols - name_width - (3 * col_overhead)].min
end
entity.data.reject{|k,v| SKIP_ATTRS.include? k}.each do |k,v|
row do
column(k)
column(v)
end
end
end
else
puts "no data"
end
end
# return hash { column_name: { max_size: 12, size: 12 } }
def collection_metadata(collection, headers=nil)
result = {}
collection.each do |entity|
if entity.is_a? Array
headers.each_with_index do |header, index|
col = result[header] ||= {}
size = entity[index].to_s.size
col[:max_size] = col[:max_size] ? [col[:max_size], size].max : size
end
else
entity.reject{|k,v| headers ? !headers.include?(k) : SKIP_ATTRS.include?(k)}.each do |k,v|
col = result[k] ||= {}
size = v.to_s.size
col[:max_size] = col[:max_size] ? [col[:max_size], size].max : size
end
end
end
total_size = result.inject(0) do |total, (col,meta)|
meta[:max_size] = [col.size, meta[:max_size]].max
total + meta[:max_size]
end
terminal_columns = HighLine.new.output_cols
overhead = (result.keys.size + 2) * col_overhead + INDEX_COL_WIDTH
if total_size + overhead < terminal_columns
result.each {|col,meta| meta[:size] = meta[:max_size]}
else
col_size = (terminal_columns - overhead) / result.keys.size
result.each {|col,meta| meta[:size] = col_size}
end
result
end