Module: HasMachineTags::TagMethods::ClassMethods

Defined in:
lib/has_machine_tags/tag_methods.rb

Instance Method Summary collapse

Instance Method Details

#build_machine_tag(namespace, predicate, value) ⇒ Object

Builds a machine tag string given namespace, predicate and value.



104
105
106
# File 'lib/has_machine_tags/tag_methods.rb', line 104

def build_machine_tag(namespace, predicate, value)
  "#{namespace}:#{predicate}=#{value}"
end

#extract_from_name(tag_name) ⇒ Object

:nodoc:



118
119
120
# File 'lib/has_machine_tags/tag_methods.rb', line 118

def extract_from_name(tag_name) #:nodoc:
  (tag_name =~ /^(#{NAMESPACE_REGEX})\:(#{PREDICATE_REGEX})\=(#{VALUE_REGEX})$/) ? [$1, $2, $3] : nil
end

#machine_tag?(machine_tag) ⇒ Boolean

Boolean indicating if given tag is a machine tag.

Returns:

  • (Boolean)


114
115
116
# File 'lib/has_machine_tags/tag_methods.rb', line 114

def machine_tag?(machine_tag)
  !extract_from_name(machine_tag).nil?
end

#machine_tags(name) ⇒ Object

Takes a wildcard machine tag and returns matching tags.



92
93
94
95
96
97
98
99
100
101
# File 'lib/has_machine_tags/tag_methods.rb', line 92

def machine_tags(name)
  conditions = if (match = match_wildcard_machine_tag(name))
    match.map {|k,v|
      sanitize_sql(["#{k} = ?", v])
    }.join(" AND ")
  else
    sanitize_sql(["name = ?", name])
  end
  find(:all, :conditions=>conditions)
end

#match_wildcard_machine_tag(name) ⇒ Object

Valid wildcards with their equivalent shortcuts namespace:*=* -> namespace: :predicate= -> predicate= :=value -> :value



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/has_machine_tags/tag_methods.rb', line 126

def match_wildcard_machine_tag(name) #:nodoc:
  if name =~ /^(#{NAMESPACE_REGEX}|\*)\:(#{PREDICATE_REGEX}|\*)\=(#{VALUE_REGEX}|\*)?$/
    result = [[:namespace, $1], [:predicate, $2], [:value, $3]].select {|k,v| ![nil,'*'].include?(v) }
    result.size == 3 ? nil : result
  #duo shortcuts
  elsif name =~ /^(#{NAMESPACE_REGEX}\:#{PREDICATE_REGEX})|(#{PREDICATE_REGEX}\=#{VALUE_REGEX})|(#{NAMESPACE_REGEX}\.#{VALUE_REGEX})$/
    $1 ? [:namespace, :predicate].zip($1.split(":")) : ($2 ? [:predicate, :value].zip($2.split("=")) :
      [:namespace, :value].zip($3.split('.')) )
  #single shortcuts
  elsif name =~ /^((#{NAMESPACE_REGEX})(?:\:)|(#{PREDICATE_REGEX})(?:\=)|(?:\=)(#{VALUE_REGEX}))$/
    $2 ? [[:namespace, $2]] : ($3 ? [[:predicate, $3]] : [[:value, $4]])
  else
    nil
  end
end

#split_machine_tag(machine_tag) ⇒ Object

Returns an array of machine tag parts: [namespace, predicate, value]



109
110
111
# File 'lib/has_machine_tags/tag_methods.rb', line 109

def split_machine_tag(machine_tag)
  extract_from_name(machine_tag) || []
end