class HammerCLI::Output::FieldFilter

Attributes

classes_filter[RW]
fields[R]
filtered_fields[R]
sets_filter[RW]

Public Class Methods

new(fields = [], filters = {}) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 6
def initialize(fields = [], filters = {})
  self.fields = fields
  @classes_filter = filters[:classes_filter] || []
  @sets_filter = filters[:sets_filter] || []
end

Public Instance Methods

fields=(fields) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 12
def fields=(fields)
  @fields = fields || []
  @filtered_fields = @fields.dup
end
filter_by_classes(classes = nil) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 17
def filter_by_classes(classes = nil)
  classes ||= @classes_filter
  classes.each do |cls|
    @filtered_fields.reject! do |f|
      f.is_a? cls
    end
  end
  self
end
filter_by_data(data, compact_only: false) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 36
def filter_by_data(data, compact_only: false)
  @filtered_fields = displayable_fields(@filtered_fields,
                                        data,
                                        compact_only: compact_only)
  self
end
filter_by_sets(sets = nil) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 27
def filter_by_sets(sets = nil)
  sets ||= @sets_filter
  return self if sets.empty?

  set_names, labels = resolve_set_names(sets)
  deep_filter(@filtered_fields, set_names, labels)
  self
end

Private Instance Methods

deep_filter(fields, set_names, labels) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 45
def deep_filter(fields, set_names, labels)
  fields.select! do |f|
    allowed = include_by_label?(labels, f.full_label.downcase)
    allowed ||= (f.sets & set_names).any?
    deep_filter(f.fields, set_names, labels) if f.respond_to?(:fields)
    allowed
  end
end
displayable_fields(fields, record, compact_only: false) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 54
def displayable_fields(fields, record, compact_only: false)
  fields.select do |field|
    field_data = HammerCLI::Output::Adapter::Abstract.data_for_field(
      field, record
    )
    if compact_only && !field_data.is_a?(HammerCLI::Output::DataMissing)
      true
    else
      field.display?(field_data)
    end
  end
end
include_by_label?(labels, label) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 67
def include_by_label?(labels, label)
  labels.any? do |l|
    l.start_with?("#{label}/") || label.match(%r{^#{l.gsub(/\*/, '.*')}(|\/.*)$}) || l == label
  end
end
resolve_set_names(sets) click to toggle source
# File lib/hammer_cli/output/field_filter.rb, line 73
def resolve_set_names(sets)
  set_names = []
  labels = []
  sets.each do |name|
    next set_names << name if name.upcase == name

    labels << name.downcase
  end
  [set_names, labels]
end