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