class Retscli::DisplayAdapter
Constants
- EMPTY_VALUE
- NO_RESULTS
Public Class Methods
new(client)
click to toggle source
# File lib/retscli/display_adapter.rb, line 8 def initialize(client) @client = client @colorer = ::Thor::Shell::Color.new end
Public Instance Methods
capabilities()
click to toggle source
# File lib/retscli/display_adapter.rb, line 18 def capabilities Terminal::Table.new(:rows => @client.capabilities.to_a) end
classes(resource)
click to toggle source
# File lib/retscli/display_adapter.rb, line 28 def classes(resource) resource_tree = retrieve_metadata.tree[resource.downcase] if resource_tree resource_tree.rets_classes.map do |klass| render_class(klass) end.join("\n") else set_color("#{resource} resource does not exist", :red) end end
login()
click to toggle source
# File lib/retscli/display_adapter.rb, line 13 def login @client.login set_color("\u2713 Logged in", :green) end
metadata()
click to toggle source
# File lib/retscli/display_adapter.rb, line 80 def metadata build_tree end
objects(resource)
click to toggle source
# File lib/retscli/display_adapter.rb, line 40 def objects(resource) resource_tree = retrieve_metadata.tree[resource.downcase] if resource_tree resource_tree.rets_objects.map do |object| render_object(object) end.join("\n") else set_color("#{resource} resource does not exist", :red) end end
open_in_editor(text, editor='editor')
click to toggle source
# File lib/retscli/display_adapter.rb, line 151 def open_in_editor(text, editor='editor') editor = editor == 'editor' ? (ENV['EDITOR'] || 'nano') : editor open_tempfile_with_content(editor, text) end
page(output)
click to toggle source
# File lib/retscli/display_adapter.rb, line 143 def page(output) begin pager = ENV['PAGER'] || 'less' IO.popen(pager, 'w') { |f| f.puts(output) } rescue Errno::EPIPE end end
resources()
click to toggle source
# File lib/retscli/display_adapter.rb, line 22 def resources retrieve_metadata.tree.map do |key, resource| render_resource(resource) end.join("\n") end
search(resource, klass, query, options={})
click to toggle source
# File lib/retscli/display_adapter.rb, line 119 def search(resource, klass, query, options={}) select = options[:select] ? options[:select].join(',') : '' count = options[:count] ? 2 : 0 results = @client.find( :all, search_type: resource, class: klass, query: query, select: select, limit: options[:limit], offset: options[:offset], count: count, format: options[:format], no_records_not_an_error: true ) if results.is_a?(Integer) resource_table([{ 'count' => results }]) else resource_table(results) end end
search_metadata(search, options={})
click to toggle source
# File lib/retscli/display_adapter.rb, line 84 def search_metadata(search, options={}) options = { :resources => [], :classes => [] , :color => true }.merge(options) search_results = '' resources = options[:resources].map!{ |res| res.downcase } classes = options[:classes].map!{ |klass| klass.downcase } retrieve_metadata.tree.each do |key, res| next if !resources.empty? && !resources.include?(res.id.downcase) match_found_for_resouce = false res.rets_classes.each do |klass| next if !classes.empty? && !classes.include?(klass.name.downcase) match_found_for_class = false klass.tables.each do |table| if match = search_table(table, search) search_results << render_resource(res) << "\n" unless match_found_for_resouce search_results << tab_over(render_class(klass), 1) << "\n" unless match_found_for_class rendered_table = tab_over(render_table(table), 2) search_results << rendered_table.gsub!(match.regexp) do |sub| options[:color] ? set_color(sub, :red, :on_white) : sub end << "\n" match_found_for_resouce = true match_found_for_class = true end end end end search_results end
tables(resource, klass)
click to toggle source
# File lib/retscli/display_adapter.rb, line 52 def tables(resource, klass) resource_tree = retrieve_metadata.tree[resource.downcase] return set_color("#{resource} resource does not exist", :red) unless resource_tree resource_class = resource_tree.rets_classes.detect { |rc| rc.name.downcase == klass.downcase } return set_color("#{klass} class does not exist", :red) unless resource_class resource_class.tables.map do |table| render_table(table) end.join("\n") end
timezone_offset()
click to toggle source
# File lib/retscli/display_adapter.rb, line 64 def timezone_offset offset = retrieve_metadata .metadata_types[:system] .first .fragment .xpath('SYSTEM') .attribute('TimeZoneOffset') .to_s if offset.empty? set_color("No offset specified", :red) else offset end end
Private Instance Methods
build_tree()
click to toggle source
# File lib/retscli/display_adapter.rb, line 198 def build_tree tree = '' retrieve_metadata.tree.each do |name, resource| tree << render_resource(resource) resource.rets_classes.each do |klass| tree << "\n" tree << tab_over(render_class(klass), 1) klass.tables.each do |table| tree << "\n" tree << tab_over(render_table(table), 2) end end resource.rets_objects.each do |object| tree << "\n" tree << tab_over(render_object(object), 1) end tree << "\n" end tree end
open_tempfile_with_content(editor, initial_content)
click to toggle source
# File lib/retscli/display_adapter.rb, line 169 def open_tempfile_with_content(editor, initial_content) temp_file do |f| f.puts(initial_content) f.flush f.close(false) system(editor, f.path) File.read(f.path) end end
render_class(klass)
click to toggle source
# File lib/retscli/display_adapter.rb, line 228 def render_class(klass) "Class: #{klass.name}\n"\ " Visible Name: #{klass.visible_name}\n"\ " Description : #{klass.description}" end
render_lookup_type(type)
click to toggle source
# File lib/retscli/display_adapter.rb, line 271 def render_lookup_type(type) "#{type.long_value} -> #{type.value}" end
render_object(object)
click to toggle source
# File lib/retscli/display_adapter.rb, line 234 def render_object(object) "Object: #{object.name}\n"\ " MimeType: #{object.mime_type}\n"\ " Description: #{object.description}" end
render_resource(resource)
click to toggle source
# File lib/retscli/display_adapter.rb, line 224 def render_resource(resource) "Resource: #{resource.id} (Key Field: #{resource.key_field})" end
render_table(table)
click to toggle source
# File lib/retscli/display_adapter.rb, line 240 def render_table(table) types = false if table.is_a?(::Rets::Metadata::LookupTable) header = "LookupTable: #{table.name}" types = true elsif table.is_a?(::Rets::Metadata::MultiLookupTable) header = "MultiLookupTable: #{table.name}" types = true else header = "Table: #{table.name}" end base = "#{header}\n"\ " Resource: #{table.resource_id}\n"\ " ShortName: #{table.table_fragment["ShortName"] }\n"\ " LongName: #{table.long_name }\n"\ " StandardName: #{table.table_fragment["StandardName"] }\n"\ " Units: #{table.table_fragment["Units"] }\n"\ " Searchable: #{table.table_fragment["Searchable"] }\n"\ " Required: #{table.table_fragment['Required']}" if types base << "\n Types:" table.lookup_types.each do |type| base << "\n #{render_lookup_type(type)}" end end base end
resource_table(results=[])
click to toggle source
# File lib/retscli/display_adapter.rb, line 157 def resource_table(results=[]) term_table = Terminal::Table.new if results.empty? term_table.rows = [[NO_RESULTS]] else term_table.headings = results.first.keys term_table.rows = results.map{ |result| result.values.map!{ |value| value.to_s.empty? ? EMPTY_VALUE : value } } end term_table end
retrieve_metadata()
click to toggle source
# File lib/retscli/display_adapter.rb, line 186 def retrieve_metadata @client.metadata end
search_table(table, search)
click to toggle source
# File lib/retscli/display_adapter.rb, line 190 def search_table(table, search) regex = /#{search}/i table.table_fragment['LongName'].match(regex) || table.table_fragment['SystemName'].match(regex) || table.table_fragment['ShortName'].match(regex) || table.table_fragment['StandardName'].match(regex) end
set_color(text, *args)
click to toggle source
# File lib/retscli/display_adapter.rb, line 280 def set_color(text, *args) @colorer.set_color(text, *args) end
tab_over(str, num_tabs)
click to toggle source
# File lib/retscli/display_adapter.rb, line 275 def tab_over(str, num_tabs) tab_width = " " str.prepend(tab_width*num_tabs).gsub!("\n", "\n#{tab_width*num_tabs}") end
temp_file(ext='.txt') { |file| ... }
click to toggle source
# File lib/retscli/display_adapter.rb, line 179 def temp_file(ext='.txt') file = Tempfile.new(['retscli', ext]) yield file ensure file.close(true) if file end