Class: Gitrob::BlobObserver

Inherits:
Object
  • Object
show all
Defined in:
lib/gitrob/blob_observer.rb

Defined Under Namespace

Classes: CorruptSignaturesError, Signature

Constant Summary collapse

SIGNATURES_FILE_PATH =
File.expand_path(
"../../../signatures.json", __FILE__)
REQUIRED_SIGNATURE_KEYS =
%w(part type pattern caption description)
ALLOWED_TYPES =
%w(regex match)
ALLOWED_PARTS =
%w(path filename extension)

Class Method Summary collapse

Class Method Details

.load_signatures!Object



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/gitrob/blob_observer.rb', line 31

def self.load_signatures!
  @signatures = []
  JSON.load(File.read(SIGNATURES_FILE_PATH)).each do |signature|
    @signatures << Signature.new(signature)
  end
  validate_signatures!
rescue CorruptSignaturesError => e
  raise e
rescue
  raise CorruptSignaturesError, "Could not parse signature file"
end

.observe(blob) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/gitrob/blob_observer.rb', line 13

def self.observe(blob)
  signatures.each do |signature|
    if signature.type == "match"
      observe_with_match_signature(blob, signature)
    else
      observe_with_regex_signature(blob, signature)
    end
  end
  blob.flags_count = blob.flags.count
  blob.save
  blob.flags_count
end

.observe_with_match_signature(blob, signature) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/gitrob/blob_observer.rb', line 82

def self.observe_with_match_signature(blob, signature)
  haystack = blob.send(signature.part.to_sym)
  return unless haystack == signature.pattern
  blob.add_flag(
    :caption     => signature.caption,
    :description => signature.description,
    :assessment  => blob.assessment
  )
end

.observe_with_regex_signature(blob, signature) ⇒ Object



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

def self.observe_with_regex_signature(blob, signature)
  haystack = blob.send(signature.part.to_sym)
  regex    = Regexp.new(signature.pattern, Regexp::IGNORECASE)
  return if regex.match(haystack).nil?
  blob.add_flag(
    :caption     => signature.caption,
    :description => signature.description,
    :assessment  => blob.assessment
  )
end

.signaturesObject



26
27
28
29
# File 'lib/gitrob/blob_observer.rb', line 26

def self.signatures
  load_signatures! unless @signatures
  @signatures
end

.validate_signature!(signature) ⇒ Object



53
54
55
56
57
# File 'lib/gitrob/blob_observer.rb', line 53

def self.validate_signature!(signature)
  validate_signature_keys!(signature)
  validate_signature_type!(signature)
  validate_signature_part!(signature)
end

.validate_signature_keys!(signature) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/gitrob/blob_observer.rb', line 59

def self.validate_signature_keys!(signature)
  REQUIRED_SIGNATURE_KEYS.each do |key|
    unless signature.respond_to?(key)
      fail CorruptSignaturesError,
           "Missing required signature key: #{key}"
    end
  end
end

.validate_signature_part!(signature) ⇒ Object



75
76
77
78
79
80
# File 'lib/gitrob/blob_observer.rb', line 75

def self.validate_signature_part!(signature)
  unless ALLOWED_PARTS.include?(signature.part)
    fail CorruptSignaturesError,
         "Invalid signature part: #{signature.part}"
  end
end

.validate_signature_type!(signature) ⇒ Object



68
69
70
71
72
73
# File 'lib/gitrob/blob_observer.rb', line 68

def self.validate_signature_type!(signature)
  unless ALLOWED_TYPES.include?(signature.type)
    fail CorruptSignaturesError,
         "Invalid signature type: #{signature.type}"
  end
end

.validate_signatures!Object



43
44
45
46
47
48
49
50
51
# File 'lib/gitrob/blob_observer.rb', line 43

def self.validate_signatures!
  if !signatures.is_a?(Array) || signatures.empty?
    fail CorruptSignaturesError,
         "Signature file contains no signatures"
  end
  signatures.each do |signature|
    validate_signature!(signature)
  end
end