Skip to content

Commit d0340dd

Browse files
xprazak2akofink
authored andcommitted
Maintenance refactoring (#7)
Extracts rule results and test result into a separate concerns. Improves how newlines are removed from text.
1 parent 0d956bb commit d0340dd

7 files changed

Lines changed: 73 additions & 17 deletions

File tree

lib/openscap_parser.rb

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'openscap_parser/profiles'
33
require 'openscap_parser/rule'
44
require 'openscap_parser/rule_result'
5+
require 'openscap_parser/rule_results'
56
require 'openscap_parser/rules'
67
require 'openscap_parser/version'
78
require 'openscap_parser/xml_report'
@@ -16,6 +17,7 @@ class Base
1617
include OpenscapParser::XMLReport
1718
include OpenscapParser::Profiles
1819
include OpenscapParser::Rules
20+
include OpenscapParser::RuleResults
1921

2022
def initialize(report)
2123
report_xml(report)
@@ -32,14 +34,5 @@ def start_time
3234
def end_time
3335
@end_time ||= DateTime.parse(test_result_node['end-time'])
3436
end
35-
36-
def rule_results
37-
@rule_results ||= test_result_node.search('rule-result').map do |rr|
38-
rule_result_oscap = RuleResult.new
39-
rule_result_oscap.id = rr.attributes['idref'].value
40-
rule_result_oscap.result = rr.search('result').first.text
41-
rule_result_oscap
42-
end
43-
end
4437
end
4538
end

lib/openscap_parser/profiles.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# frozen_string_literal: true
2+
require 'openscap_parser/test_result'
23

34
module OpenscapParser
45
# Methods related to saving profiles and finding which hosts
56
# they belong to
67
module Profiles
8+
include TestResult
9+
710
def self.included(base)
811
base.class_eval do
912
def profiles
@@ -18,10 +21,6 @@ def profile_node
1821
@report_xml.at_xpath(".//Profile\
1922
[contains('#{test_result_node['id']}', @id)]")
2023
end
21-
22-
def test_result_node
23-
@test_result_node ||= @report_xml.at_css('TestResult')
24-
end
2524
end
2625
end
2726
end

lib/openscap_parser/rule.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@ def title
2020
end
2121

2222
def description
23-
@description ||= @rule_xml.at_css('description').text.delete("\n")
23+
rule_node ||= @rule_xml.at_css('description')
24+
@description ||= newline_to_whitespace(rule_node.text) if rule_node && rule_node.text
2425
end
2526

2627
def rationale
27-
@rationale ||= @rule_xml.at_css('rationale').children.text.delete("\n")
28+
rationale_node ||= @rule_xml.at_css('rationale')
29+
@rationale ||= newline_to_whitespace(rationale_node.children.text) if rationale_node &&
30+
rationale_node.children &&
31+
rationale_node.children.text
2832
end
2933

3034
def references
@@ -35,10 +39,15 @@ def references
3539

3640
def identifier
3741
@identifier ||= {
38-
label: @rule_xml.at_css('ident')&.text,
42+
label: @rule_xml.at_css('ident') && @rule_xml.at_css('ident').text,
3943
system: (ident = @rule_xml.at_css('ident')) && ident['system']
4044
}
4145
end
46+
47+
private
48+
49+
def newline_to_whitespace(string)
50+
string.gsub(/ *\n+/, " ").strip
51+
end
4252
end
4353
end
44-
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
require 'openscap_parser/test_result'
3+
4+
module OpenscapParser
5+
module RuleResults
6+
include TestResult
7+
8+
def self.included(base)
9+
base.class_eval do
10+
def rule_results
11+
@rule_results ||= test_result_node.search('rule-result').map do |rr|
12+
rule_result_oscap = RuleResult.new
13+
rule_result_oscap.id = rr.attributes['idref'].value
14+
rule_result_oscap.result = rr.search('result').first.text
15+
rule_result_oscap
16+
end
17+
end
18+
end
19+
end
20+
end
21+
end

lib/openscap_parser/test_result.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# frozen_string_literal: true
2+
3+
module OpenscapParser
4+
module TestResult
5+
def self.included(base)
6+
base.class_eval do
7+
private
8+
9+
def test_result_node
10+
@test_result_node ||= @report_xml.at_css('TestResult')
11+
end
12+
end
13+
end
14+
end
15+
end

openscap_parser.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ Gem::Specification.new do |spec|
4242
spec.add_development_dependency "minitest", "~> 5.0"
4343
spec.add_development_dependency "shoulda-context"
4444
spec.add_development_dependency "pry"
45+
spec.add_development_dependency "pry-byebug"
4546
end

test/openscap_parser_test.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,23 @@ def setup
6969

7070
assert_equal references, rule.references
7171
end
72+
73+
should 'parse rule description without newlines' do
74+
rule = @report_parser.rule_objects.find do |rule_obj|
75+
rule_obj.id == 'xccdf_org.ssgproject.content_rule_service_atd_disabled'
76+
end
77+
78+
desc = <<~DESC.gsub("\n", ' ').strip
79+
The at and batch commands can be used to
80+
schedule tasks that are meant to be executed only once. This allows delayed
81+
execution in a manner similar to cron, except that it is not
82+
recurring. The daemon atd keeps track of tasks scheduled via
83+
at and batch, and executes them at the specified time.
84+
The atd service can be disabled with the following command:
85+
$ sudo systemctl disable atd.service
86+
DESC
87+
88+
assert_equal desc, rule.description
89+
end
7290
end
7391
end

0 commit comments

Comments
 (0)