Class: Gitrob::BlobObserver
- Inherits:
-
Object
- Object
- Gitrob::BlobObserver
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__)
- CUSTOM_SIGNATURES_FILE_PATH =
File.join(
Dir.home, ".gitrobsignatures")
- 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
.custom_signatures? ⇒ Boolean
.load_custom_signatures! ⇒ Object
.load_signatures! ⇒ Object
33
34
35
36
37
38
39
40
41
42
43
44
|
# File 'lib/gitrob/blob_observer.rb', line 33
def self.load_signatures!
@signatures = []
signatures = JSON.load(File.read(SIGNATURES_FILE_PATH))
validate_signatures!(signatures)
signatures.each_with_index do |signature|
@signatures << Signature.new(signature)
end
rescue CorruptSignaturesError => e
raise e
rescue
raise CorruptSignaturesError, "Could not parse signature file"
end
|
.observe(blob) ⇒ Object
15
16
17
18
19
20
21
22
23
24
25
26
|
# File 'lib/gitrob/blob_observer.rb', line 15
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
110
111
112
113
114
115
116
117
118
|
# File 'lib/gitrob/blob_observer.rb', line 110
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
120
121
122
123
124
125
126
127
128
129
|
# File 'lib/gitrob/blob_observer.rb', line 120
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
|
.signatures ⇒ Object
28
29
30
31
|
# File 'lib/gitrob/blob_observer.rb', line 28
def self.signatures
load_signatures! unless @signatures
@signatures
end
|
.unload_signatures ⇒ Object
46
47
48
|
# File 'lib/gitrob/blob_observer.rb', line 46
def self.unload_signatures
@signatures = []
end
|
.validate_signature!(signature) ⇒ Object
81
82
83
84
85
|
# File 'lib/gitrob/blob_observer.rb', line 81
def self.validate_signature!(signature)
validate_signature_keys!(signature)
validate_signature_type!(signature)
validate_signature_part!(signature)
end
|
.validate_signature_keys!(signature) ⇒ Object
87
88
89
90
91
92
93
94
|
# File 'lib/gitrob/blob_observer.rb', line 87
def self.validate_signature_keys!(signature)
REQUIRED_SIGNATURE_KEYS.each do |key|
unless signature.key?(key)
fail CorruptSignaturesError,
"Missing required signature key: #{key}"
end
end
end
|
.validate_signature_part!(signature) ⇒ Object
103
104
105
106
107
108
|
# File 'lib/gitrob/blob_observer.rb', line 103
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
96
97
98
99
100
101
|
# File 'lib/gitrob/blob_observer.rb', line 96
def self.validate_signature_type!(signature)
unless ALLOWED_TYPES.include?(signature["type"])
fail CorruptSignaturesError,
"Invalid signature type: #{signature['type']}"
end
end
|
.validate_signatures!(signatures) ⇒ Object
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/gitrob/blob_observer.rb', line 66
def self.validate_signatures!(signatures)
if !signatures.is_a?(Array) || signatures.empty?
fail CorruptSignaturesError,
"Signature file contains no signatures"
end
signatures.each_with_index do |signature, index|
begin
validate_signature!(signature)
rescue CorruptSignaturesError => e
raise CorruptSignaturesError,
"Validation failed for Signature ##{index + 1}: #{e.message}"
end
end
end
|