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.



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

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)


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

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

.version_strObject



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

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

Instance Method Details

#all_directiveObject



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

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

#context_dependent_evaluation?Boolean

Returns:

  • (Boolean)


77
78
79
80
81
# File 'lib/coppertone/record.rb', line 77

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

  redirect&.context_dependent?
end

#context_dependent_explanation?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/coppertone/record.rb', line 87

def context_dependent_explanation?
  exp&.context_dependent?
end

#directivesObject



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

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

#dns_lookup_term_countObject



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

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

#expObject



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

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

#find_modifier(klass) ⇒ Object



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

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

  arr.first
end

#find_redirectObject



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

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

#include_all?Boolean

Returns:

  • (Boolean)


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

def include_all?
  all_directive ? true : false
end

#includesObject



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

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

#modifiersObject



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

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

#netblock_mechanismsObject



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

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

#netblocks_only?Boolean

Returns:

  • (Boolean)


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

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



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

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

#redirectObject



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

def redirect
  @redirect ||= find_redirect
end

#redirect_with_directives?Boolean

Returns:

  • (Boolean)


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

def redirect_with_directives?
  redirect && directives.any?
end

#to_sObject



113
114
115
# File 'lib/coppertone/record.rb', line 113

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

#unknown_modifiersObject



93
94
95
96
# File 'lib/coppertone/record.rb', line 93

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