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