onlyoffice_rspec_result_parser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1e0498075e6fc9529b3ab53e7b99fef574e7e02a8a185e59d7889010402c97a5
4
+ data.tar.gz: ad609118fa567af873dcbc09875942b01d306bf91ea80ef4dfe2346e51d3f271
5
+ SHA512:
6
+ metadata.gz: 3060d19a305e4fa19ee1b1c7c9371f141d93f345fcb2dfa9178b3b71f7d3a332a767d70691b6d7a457eed737342f07ccce632d851ceed5af31e6b0630bc44b7a
7
+ data.tar.gz: f455696715c4921e44dc463c68e28ca075860fd09a63418da47649a377f096846f4dd7ba65ec92a09910f73c79200a414736e100a8262d86eebcf33dab7148ef
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onlyoffice_rspec_result_parser/rspec_result_parser'
4
+ require 'onlyoffice_rspec_result_parser/version'
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeRspecResultParser
4
+ # Class for string methods
5
+ class StringHelper
6
+ def self.get_style_param(string, param)
7
+ m = string.match(/#{param}:\s(.*);/)
8
+ m[1]
9
+ end
10
+
11
+ def self.delete_px(string)
12
+ string.gsub 'px', ''
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require 'uri'
5
+
6
+ require_relative 'helper/string_helper'
7
+ require_relative 'rspec_result_parser/describe'
8
+ require_relative 'rspec_result_parser/example'
9
+ require_relative 'rspec_result_parser/result_creator'
10
+ require_relative 'rspec_result_parser/rspec_result'
11
+
12
+ module OnlyofficeRspecResultParser
13
+ # Class with stored data about rspec result
14
+ class ResultParser
15
+ @example_index = 0
16
+
17
+ class << self
18
+ attr_accessor :example_index
19
+
20
+ def parse_rspec_html(html_path)
21
+ page = Nokogiri::HTML(read_file(html_path))
22
+ parse_test_result(page)
23
+ end
24
+
25
+ # @param file [String] path to file
26
+ # @return [RspecResult] result of parsing
27
+ def parse_metadata(file)
28
+ page = Nokogiri::HTML(read_file(file))
29
+ parse_test_result(page, with_describe_info: false)
30
+ end
31
+
32
+ alias parse_rspec_html_string parse_rspec_html
33
+
34
+ def get_failed_cases_count_from_html(html_path)
35
+ page = Nokogiri::HTML(read_file(html_path))
36
+ RspecResult.new.parse_page(page, true).failed_count
37
+ end
38
+
39
+ def get_total_result_of_rspec_html(html_path)
40
+ page = Nokogiri::HTML(read_file(html_path))
41
+ RspecResult.new.parse_page(page, true).total
42
+ end
43
+
44
+ # @param page [String] data in page
45
+ # @param with_describe_info [Boolean] if
46
+ # describe metadata should be included
47
+ # @return [RspecResult] result of parsing
48
+ def parse_test_result(page, with_describe_info: true)
49
+ ResultParser.example_index = 0
50
+ RspecResult.new.parse_page(page, with_describe_info)
51
+ end
52
+
53
+ private
54
+
55
+ # Read file from disk or use string
56
+ # @param data [String] filepath or data string
57
+ # @return [String] result of read
58
+ def read_file(data)
59
+ return data unless File.exist?(data)
60
+
61
+ File.read(data)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeRspecResultParser
4
+ # rspec describe data
5
+ class Describe
6
+ attr_accessor :child, :text
7
+
8
+ def initialize(text, child = [], result = nil)
9
+ @text = text
10
+ @child = child
11
+ @result = result
12
+ end
13
+
14
+ def find_last_on_lvl(level)
15
+ level.zero? ? self : @child.last.find_last_on_lvl(level - 1)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeRspecResultParser
4
+ # rspec example data
5
+ class Example
6
+ attr_accessor :text, :duration, :message, :backtrace, :code, :log, :passed
7
+ # @return [String] link to page url
8
+ attr_accessor :page_url
9
+ # @return [String] link to screenshot
10
+ attr_accessor :screenshot
11
+
12
+ def initialize(data)
13
+ fetch_data(data)
14
+ @page_url = fetch_page_url
15
+ @screenshot = fetch_screenshot
16
+ end
17
+
18
+ private
19
+
20
+ def fetch_data(data)
21
+ @text = data.css('span').first.text
22
+ @passed = data[:class].split(' ')[1]
23
+ if @passed == 'failed'
24
+ fetch_failed_data(data)
25
+ elsif @passed == 'passed'
26
+ @duration = data.css('span')[1].text
27
+ end
28
+ end
29
+
30
+ def fetch_page_url
31
+ return nil unless @message
32
+
33
+ message_url_line = @message.match(/^.*Page address:.*/)
34
+ return nil unless message_url_line
35
+
36
+ message_url_line.to_s.match(/'.*'/).to_s.delete("'")
37
+ end
38
+
39
+ def fetch_screenshot
40
+ return nil unless @message
41
+
42
+ screenshot_line = @message.match(/^.*Error screenshot:.*/)
43
+ return nil unless screenshot_line
44
+
45
+ screenshot_line.to_s.match(/'.*?'/).to_s.delete("'")
46
+ end
47
+
48
+ # Method make all links in text clickable
49
+ # @param [String] text current text
50
+ # @return [String] text with clickable link
51
+ def format_link(text)
52
+ links = URI.extract(text)
53
+ links.each do |current_link|
54
+ if current_link.end_with?('png', 'jpg')
55
+ text.gsub!(current_link, link_url_50_percent(current_link))
56
+ elsif current_link.start_with?('http')
57
+ text.gsub!(current_link, link_url(current_link))
58
+ end
59
+ end
60
+ text
61
+ end
62
+
63
+ # Fetch data for failed case
64
+ # @param data [Nokogiri::XML::Element] element to parse
65
+ def fetch_failed_data(data)
66
+ @duration = data.css('span')[1].text
67
+ @message = format_link(data.css('div.message').text)
68
+ @backtrace = data.css('div.backtrace').text
69
+ @code = data.css('code').children.to_s
70
+ end
71
+
72
+ # @param [String] link to insert
73
+ # @return [String] result link with 50 percent size
74
+ def link_url_50_percent(link)
75
+ "<a href='#{link}'><img src='#{link}' height='50%' width='50%'></a>"
76
+ end
77
+
78
+ # @param [String] link to insert
79
+ # @return [String] result link
80
+ def link_url(link)
81
+ "<a href='#{link}'>#{link}</a>"
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeRspecResultParser
4
+ # rspec ResultCreator methods
5
+ class ResultCreator
6
+ # @return [Describe] result describe
7
+ attr_reader :final_result
8
+
9
+ def push_to_end(describe, level)
10
+ if level.zero?
11
+ @final_result = describe
12
+ elsif level.positive?
13
+ @final_result.find_last_on_lvl(level - 1).child << describe
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeRspecResultParser
4
+ # class for storing rspec result
5
+ class RspecResult
6
+ LEVEL_MARGIN = 15
7
+
8
+ attr_accessor :processing, :result, :time, :total, :describe
9
+ # @return [Integer] how much tests failed
10
+ attr_accessor :failed_count
11
+ # @return [Integer] how much tests passed
12
+ attr_accessor :passed_count
13
+ # @return [Integer] how much tests pending
14
+ attr_accessor :pending_count
15
+
16
+ # @return [Integer] total test result count
17
+ def total_tests_count
18
+ failed_count + passed_count
19
+ end
20
+
21
+ def parse_page(page, with_describe_info = true)
22
+ @describe = get_describe(page) if with_describe_info
23
+ @processing = get_processing(page)
24
+ @result = get_total_result(page)
25
+ @time = get_total_time(page)
26
+ @total = get_totals(page)
27
+ @failed_count = get_failed_count(page)
28
+ @passed_count = get_passed_count(page)
29
+ @pending_count = get_pending_count(page)
30
+ self
31
+ end
32
+
33
+ private
34
+
35
+ def get_describe(page)
36
+ results = ResultCreator.new
37
+ page.at_css('div.results').xpath('./div').each do |current|
38
+ results.push_to_end(parse_describe(current),
39
+ get_describe_level(current))
40
+ end
41
+ results.final_result
42
+ end
43
+
44
+ def parse_describe(describe)
45
+ describe_obj = Describe.new(describe.css('dt').text)
46
+ unless describe.css('dd').empty?
47
+ describe.css('dd').each do |example|
48
+ describe_obj.child << Example.new(example)
49
+ ResultParser.example_index += 1
50
+ end
51
+ end
52
+ describe_obj
53
+ end
54
+
55
+ def get_describe_level(describe)
56
+ style_string = describe.xpath('./dl')[0][:style]
57
+ style_parameter = StringHelper.get_style_param(style_string,
58
+ 'margin-left')
59
+ StringHelper.delete_px(style_parameter).to_i / LEVEL_MARGIN
60
+ end
61
+
62
+ def get_processing(page)
63
+ processing = page.css('script:contains("moveProgressBar")').last
64
+ return '0' unless processing
65
+
66
+ process = processing.text.strip.split('\'')[1]
67
+ if process == ''
68
+ '0'
69
+ else
70
+ process
71
+ end
72
+ end
73
+
74
+ def get_total_result(page)
75
+ get_totals(page).include?(' 0 failures')
76
+ end
77
+
78
+ def get_totals(page)
79
+ totals = ''
80
+ total_elem = page.css('script:contains(" example")')
81
+ return totals unless total_elem
82
+
83
+ totals = total_elem.text.match(/"(.*?)"/)
84
+ if totals
85
+ totals[1]
86
+ else
87
+ ''
88
+ end
89
+ end
90
+
91
+ def get_failed_count(page)
92
+ page.xpath("//*[@class='example failed']").length
93
+ end
94
+
95
+ def get_passed_count(page)
96
+ page.xpath("//*[@class='example passed']").length
97
+ end
98
+
99
+ def get_pending_count(page)
100
+ page.xpath("//*[@class='example not_implemented']").length
101
+ end
102
+
103
+ def get_total_time(page)
104
+ total_time = page.css('script:contains("Finished in")')
105
+ .text
106
+ .match(/>(.*?)</)
107
+ if total_time
108
+ total_time[1]
109
+ else
110
+ ''
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeRspecResultParser
4
+ VERSION = '0.1.0'
5
+ NAME = 'onlyoffice_rspec_result_parser'
6
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onlyoffice_rspec_result_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ONLYOFFICE
8
+ - Pavel Lobashov
9
+ - Ivan Tugin
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2020-03-20 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.6'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.6'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rake
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '13.0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '13.0'
43
+ description: Gem to parse rspec results. Needed in wrata project
44
+ email:
45
+ - shockwavenn@gmail.com
46
+ executables: []
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - lib/onlyoffice_rspec_result_parser.rb
51
+ - lib/onlyoffice_rspec_result_parser/helper/string_helper.rb
52
+ - lib/onlyoffice_rspec_result_parser/rspec_result_parser.rb
53
+ - lib/onlyoffice_rspec_result_parser/rspec_result_parser/describe.rb
54
+ - lib/onlyoffice_rspec_result_parser/rspec_result_parser/example.rb
55
+ - lib/onlyoffice_rspec_result_parser/rspec_result_parser/result_creator.rb
56
+ - lib/onlyoffice_rspec_result_parser/rspec_result_parser/rspec_result.rb
57
+ - lib/onlyoffice_rspec_result_parser/version.rb
58
+ homepage: https://github.com/onlyoffice-testing-robot/onlyoffice_rspec_result_parser
59
+ licenses:
60
+ - AGPL-3.0
61
+ metadata:
62
+ bug_tracker_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_rspec_result_parser/issues
63
+ changelog_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_rspec_result_parser/blob/master/CHANGELOG.md
64
+ documentation_uri: https://www.rubydoc.info/gems/onlyoffice_rspec_result_parser
65
+ homepage_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_rspec_result_parser
66
+ source_code_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_rspec_result_parser
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '2.3'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubygems_version: 3.0.6
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Gem to parse rspec results
86
+ test_files: []