Class: ElementFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/element_filter.rb

Overview

Copyright © 2013-2015 SUSE LLC

This program is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, contact SUSE LLC.

To contact SUSE about this file by physical or electronic mail, you may find current contact information at www.suse.com

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, operator = nil, matchers = nil) ⇒ ElementFilter

Returns a new instance of ElementFilter.



21
22
23
24
25
26
27
28
29
30
# File 'lib/element_filter.rb', line 21

def initialize(path, operator = nil, matchers = nil)
  @path = path
  @matchers = {}

  if ![NilClass, String, Array].include?(matchers.class)
    raise Machinery::Errors::InvalidFilter.new("Wrong filter type")
  end

  add_matchers(operator, matchers) if operator && matchers
end

Instance Attribute Details

#matchersObject

Returns the value of attribute matchers.



19
20
21
# File 'lib/element_filter.rb', line 19

def matchers
  @matchers
end

#pathObject

Returns the value of attribute path.



19
20
21
# File 'lib/element_filter.rb', line 19

def path
  @path
end

Instance Method Details

#==(other) ⇒ Object



78
79
80
81
# File 'lib/element_filter.rb', line 78

def ==(other)
  path == other.path &&
    matchers == other.matchers
end

#add_matchers(operator, matchers) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/element_filter.rb', line 32

def add_matchers(operator, matchers)
  if ![Filter::OPERATOR_EQUALS, Filter::OPERATOR_EQUALS_NOT].include?(operator)
    raise Machinery::Errors::InvalidFilter.new("Wrong filter operator '#{operator}'")
  end

  @matchers[operator] ||= []
  @matchers[operator] += Array(matchers)
end

#filters_scope?(scope) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/element_filter.rb', line 74

def filters_scope?(scope)
  (path =~ /\/#{scope}(\/|$)/) ? true : false
end

#matches?(value) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/element_filter.rb', line 41

def matches?(value)
  @matchers.each do |operator, matchers|
    matchers.each do |matcher|
      values_equal = case value
      when Machinery::Array
        value_array = value.elements

        (value_array - Array(matcher)).empty? && (Array(matcher) - value_array).empty?
      when String
        if matcher.is_a?(Array)
          exception = Machinery::Errors::ElementFilterTypeMismatch.new
          exception.failed_matcher =
            "#{path}#{operator}#{matcher.join(",")}"
          raise exception
        end

        if matcher.end_with?("*")
          value.start_with?(matcher[0..-2])
        else
          value == matcher
        end
      end
      if operator == Filter::OPERATOR_EQUALS
        return true if values_equal
      elsif operator == Filter::OPERATOR_EQUALS_NOT
        return true if !values_equal
      end
    end
  end

  false
end