Class: AutomateIt::TagManager::TagParser

Inherits:
Object
  • Object
show all
Includes:
Nitpick
Defined in:
lib/automateit/tag_manager/tag_parser.rb

Overview

TagManager::TagParser

Helper class for parsing tags. Not useful for users – for internal use only.

Constant Summary collapse

HOSTS_FOR_VALUE =
/(.+?)/
HOSTS_FOR_INCLUDE_TAG_RE =
/^INCLUDE_TAG #{HOSTS_FOR_VALUE}$/
HOSTS_FOR_EXCLUDE_TAG_RE =
/^EXCLUDE_TAG #{HOSTS_FOR_VALUE}$/
HOSTS_FOR_EXCLUDE_HOST_RE =
/^EXCLUDE_HOST #{HOSTS_FOR_VALUE}$/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Nitpick

included

Methods included from Nitpick::ClassMethods

#nitpick

Constructor Details

#initialize(struct) ⇒ TagParser

Create a parser for the struct, a hash of tag keys to values with arrays of items.



10
11
12
13
# File 'lib/automateit/tag_manager/tag_parser.rb', line 10

def initialize(struct)
  self.struct = struct
  normalize!
end

Instance Attribute Details

#structObject

Returns the value of attribute struct.



7
8
9
# File 'lib/automateit/tag_manager/tag_parser.rb', line 7

def struct
  @struct
end

Class Method Details

.expand(struct) ⇒ Object

Expand the struct.



90
91
92
# File 'lib/automateit/tag_manager/tag_parser.rb', line 90

def self.expand(struct)
  self.new(struct).expand
end

.normalize(text) ⇒ Object

Normalize a block of text to replace shortcut symbols that cause YAML to choke.



16
17
18
19
20
21
# File 'lib/automateit/tag_manager/tag_parser.rb', line 16

def self.normalize(text)
  return text \
    .gsub(/^(\s*-\s+)(!@)/, '\1EXCLUDE_TAG ') \
    .gsub(/^(\s*-\s+)(!)/, '\1EXCLUDE_HOST ') \
    .gsub(/^(\s*-\s+)(@)/, '\1INCLUDE_TAG ')
end

Instance Method Details

#expandObject

Expand the include/exclude/group rules and return a struct with only the hosts these rules produce.



76
77
78
79
80
81
82
# File 'lib/automateit/tag_manager/tag_parser.rb', line 76

def expand
  result = {}
  for tag in tags
    result[tag] = hosts_for(tag)
  end
  result
end

#expand!Object

Replace the internal struct with an expanded version, see #expand.



85
86
87
# File 'lib/automateit/tag_manager/tag_parser.rb', line 85

def expand!
  struct.replace(expand)
end

#hosts_for(tag) ⇒ Object

Return array of hosts for the tag.

Raises:

  • (IndexError)


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
# File 'lib/automateit/tag_manager/tag_parser.rb', line 42

def hosts_for(tag)
  raise IndexError.new("Unknown tag - #{tag}") unless struct.has_key?(tag)
  return [] if struct[tag].nil? # Tag has no leaves

  nitpick "\nAA %s" % tag
  hosts = Set.new
  for item in struct[tag]
    case item
    when HOSTS_FOR_INCLUDE_TAG_RE
      nitpick "+g %s" % $1
      hosts.merge(hosts_for($1))
    when HOSTS_FOR_EXCLUDE_TAG_RE
      nitpick "-g %s" % $1
      hosts.subtract(hosts_for($1))
    when HOSTS_FOR_EXCLUDE_HOST_RE
      nitpick "-h %s" % $1
      hosts.delete($1)
    else
      nitpick "+h %s" % item
      hosts << item
    end
  end
  result = hosts.to_a
  nitpick "ZZ %s for %s" % [result.inspect, tag]
  return result
end

#normalize!Object

Normalize the contents of the internal struct.



24
25
26
27
28
29
30
31
32
33
34
# File 'lib/automateit/tag_manager/tag_parser.rb', line 24

def normalize!
  for tag, items in struct
    next unless items
    for item in items
      next unless item
      item.gsub!(/^(\!@|\^@)\s*/, 'EXCLUDE_TAG ')
      item.gsub!(/^(\!|\^)\s*/, 'EXCLUDE_HOST ')
      item.gsub!(/^(@)\s*/, 'INCLUDE_TAG ')
    end
  end
end

#tagsObject

Return array of tags.



70
71
72
# File 'lib/automateit/tag_manager/tag_parser.rb', line 70

def tags
  return struct.keys
end