Class: Coppertone::Record

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

Overview

Represents an SPF record. Includes class level methods for parsing record from a text string.

Constant Summary collapse

KNOWN_MODS =
[Coppertone::Modifier::Exp, Coppertone::Modifier::Redirect].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(raw_text) ⇒ Record

Returns a new instance of Record.



6
7
8
9
# File 'lib/coppertone/record.rb', line 6

def initialize(raw_text)
  @terms = Coppertone::RecordTermParser.new(raw_text).terms
  normalize_terms
end

Instance Attribute Details

#textObject (readonly)

Returns the value of attribute text.



5
6
7
# File 'lib/coppertone/record.rb', line 5

def text
  @text
end

Class Method Details

.record?(record_text) ⇒ Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/coppertone/record.rb', line 11

def self.record?(record_text)
  Coppertone::RecordTermParser.record?(record_text)
end

.version_strObject



105
106
107
# File 'lib/coppertone/record.rb', line 105

def self.version_str
  Coppertone::RecordTermParser::VERSION_STR
end

Instance Method Details

#all_directiveObject



24
25
26
# File 'lib/coppertone/record.rb', line 24

def all_directive
  @all_directive ||= directives.find(&:all?)
end

#context_dependent_evaluation?Boolean

Returns:

  • (Boolean)


75
76
77
78
# File 'lib/coppertone/record.rb', line 75

def context_dependent_evaluation?
  return true if directives.any?(&:context_dependent?)
  redirect && redirect.context_dependent?
end

#context_dependent_explanation?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/coppertone/record.rb', line 84

def context_dependent_explanation?
  exp && exp.context_dependent?
end

#directivesObject



20
21
22
# File 'lib/coppertone/record.rb', line 20

def directives
  @directives ||= @terms.select { |t| t.is_a?(Coppertone::Directive) }
end

#dns_lookup_term_countObject



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

def dns_lookup_term_count
  @dns_lookup_term_count ||=
    begin
      base = redirect.nil? ? 0 : 1
      base + directives.count(&:dns_lookup_term?)
    end
end

#expObject



80
81
82
# File 'lib/coppertone/record.rb', line 80

def exp
  @exp ||= find_modifier(Coppertone::Modifier::Exp)
end

#find_modifier(klass) ⇒ Object



95
96
97
98
99
# File 'lib/coppertone/record.rb', line 95

def find_modifier(klass)
  arr = modifiers.select { |m| m.is_a?(klass) }
  raise DuplicateModifierError if arr.size > 1
  arr.first
end

#find_redirectObject



101
102
103
# File 'lib/coppertone/record.rb', line 101

def find_redirect
  find_modifier(Coppertone::Modifier::Redirect)
end

#include_all?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/coppertone/record.rb', line 28

def include_all?
  all_directive ? true : false
end

#includesObject



40
41
42
43
44
45
46
47
# File 'lib/coppertone/record.rb', line 40

def includes
  @includes ||=
    begin
      directives.select do |d|
        d.mechanism.is_a?(Coppertone::Mechanism::Include)
      end
    end
end

#modifiersObject



49
50
51
# File 'lib/coppertone/record.rb', line 49

def modifiers
  @modifiers ||= @terms.select { |t| t.is_a?(Coppertone::Modifier) }
end

#netblock_mechanismsObject



61
62
63
64
65
66
# File 'lib/coppertone/record.rb', line 61

def netblock_mechanisms
  @netblock_mechanisms ||=
    directives.select do |d|
      d.mechanism.is_a?(Coppertone::Mechanism::IPMechanism)
    end
end

#netblocks_only?Boolean

Returns:

  • (Boolean)


68
69
70
71
72
73
# File 'lib/coppertone/record.rb', line 68

def netblocks_only?
  return false if redirect
  directives.reject(&:all?).reject do |d|
    d.mechanism.is_a?(Coppertone::Mechanism::IPMechanism)
  end.empty?
end

#normalize_termsObject



15
16
17
18
# File 'lib/coppertone/record.rb', line 15

def normalize_terms
  find_redirect # Checks for duplicate redirect modifiers
  exp # Checks for duplicate exp modifiers
end

#redirectObject



53
54
55
# File 'lib/coppertone/record.rb', line 53

def redirect
  @redirect ||= find_redirect
end

#redirect_with_directives?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/coppertone/record.rb', line 57

def redirect_with_directives?
  redirect && directives.any?
end

#to_sObject



109
110
111
# File 'lib/coppertone/record.rb', line 109

def to_s
  "#{self.class.version_str} #{@terms.map(&:to_s).join(' ')}"
end

#unknown_modifiersObject



90
91
92
93
# File 'lib/coppertone/record.rb', line 90

def unknown_modifiers
  @unknown_modifiers ||=
    modifiers.select { |m| KNOWN_MODS.select { |k| m.is_a?(k) }.empty? }
end