Class: Pvectl::Selectors::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/selectors/base.rb

Overview

Base class for parsing and applying selectors.

Selectors use kubectl-style syntax to filter resources:

-l key=value        # equality
-l key!=value       # inequality
-l key=~pattern     # wildcard pattern
-l key in (a,b,c)   # one of many

Examples:

Parsing selectors

selector = Base.parse("status=running,tags=prod")
selector.conditions
#=> [{field: "status", operator: :eq, value: "running"},
#    {field: "tags", operator: :eq, value: "prod"}]

Applying selectors (subclass responsibility)

selector = Vm.parse("status=running")
filtered = selector.apply(vms)

Direct Known Subclasses

Container, Disk, Vm, Volume

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(conditions = []) ⇒ Base

Creates selector with parsed conditions.

Parameters:

  • conditions (Array<Hash>) (defaults to: [])

    Pre-parsed conditions



48
49
50
# File 'lib/pvectl/selectors/base.rb', line 48

def initialize(conditions = [])
  @conditions = conditions
end

Instance Attribute Details

#conditionsArray<Hash> (readonly)

Parsed conditions

Returns:

  • (Array<Hash>)

    Array of operator:, value:



26
27
28
# File 'lib/pvectl/selectors/base.rb', line 26

def conditions
  @conditions
end

Class Method Details

.parse(selector_string) ⇒ Base

Parses selector string into Base instance.

Parameters:

  • selector_string (String)

    Selector like “status=running,tags=prod”

Returns:

  • (Base)

    Selector instance with parsed conditions



32
33
34
# File 'lib/pvectl/selectors/base.rb', line 32

def self.parse(selector_string)
  new(parse_conditions(selector_string))
end

.parse_all(selector_strings) ⇒ Base

Parses multiple selector strings (from multiple -l flags).

Parameters:

  • selector_strings (Array<String>)

    Array of selector strings

Returns:

  • (Base)

    Selector instance with all conditions merged



40
41
42
43
# File 'lib/pvectl/selectors/base.rb', line 40

def self.parse_all(selector_strings)
  conditions = selector_strings.flat_map { |s| parse_conditions(s) }
  new(conditions)
end

Instance Method Details

#apply(collection) ⇒ Array

Applies selector to collection (subclass responsibility).

Parameters:

  • collection (Array)

    Items to filter

Returns:

  • (Array)

    Filtered items

Raises:

  • (NotImplementedError)

    if not implemented by subclass



64
65
66
# File 'lib/pvectl/selectors/base.rb', line 64

def apply(collection)
  raise NotImplementedError, "#{self.class}#apply must be implemented"
end

#empty?Boolean

Checks if selector is empty (no conditions).

Returns:

  • (Boolean)

    true if no conditions



55
56
57
# File 'lib/pvectl/selectors/base.rb', line 55

def empty?
  @conditions.empty?
end

#matches?(item) ⇒ Boolean

Checks if a single item matches all conditions.

Parameters:

  • item (Object)

    Item to check

Returns:

  • (Boolean)

    true if all conditions match



72
73
74
# File 'lib/pvectl/selectors/base.rb', line 72

def matches?(item)
  @conditions.all? { |cond| match_condition?(item, cond) }
end