{I: rooto:"YARD::CodeObjects::RootObject:@childrenIC:&YARD::CodeObjects::CodeObjectList[o:$YARD::CodeObjects::ModuleObject;IC;[o:&YARD::CodeObjects::ConstantObject: @files[[I"U/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/gem_version.rb:ETi :@current_file_has_commentsF: @name: VERSION:@source_type: ruby:@visibility: public: @tags[:@docstrings{:@docstringIC:YARD::Docstring" ; T;[:@ref_tags[: @allI"; T:@unresolved_reference0: @object@ :@namespace@: @pathI"Jacoco::VERSION; F: @sourceI"VERSION = '0.1.10'; T: @valueI" '0.1.10'; T: @dynamicTo:#YARD::CodeObjects::ClassObject;IC;[o:$YARD::CodeObjects::MethodObject:@module_functionF: @scope: instance;;;I""Jacoco::SAXParser#class_names; F:@parameters[; [[I"T/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/sax_parser.rb; Ti ; F;:class_names;;;[;{;IC;"0Returns the value of attribute class_names. ; T;[;[;I"0Returns the value of attribute class_names.; T;0;@:@hash_flagF: @summary0;@;I"'def class_names @class_names end; T:@signatureI"def class_names; T; To;";#F;$;%;;;I"#Jacoco::SAXParser#class_names=; F;&[[I" value; T0; [[@i ; F;:class_names=;;;[;{;IC;"#Sets the attribute class_names ; T;[o:YARD::Tags::Tag :@tag_nameI" param; F: @textI"3the value to set the attribute class_names to.; T;I" value; T: @types0;@';[;I"_Sets the attribute class_names @param value the value to set the attribute class_names to.; T;0;@';(F;)0;@;I"7def class_names=(value) @class_names = value end; T;*I"def class_names=(value); T; To;";#F;$;%;;;I"Jacoco::SAXParser#classes; F;&[; [[@i ; F;: classes;;;[;{;IC;",Returns the value of attribute classes. ; T;[;[;I",Returns the value of attribute classes.; T;0;@:;(F;)0;@;I"def classes @classes end; T;*I"def classes; T; To;";#F;$;%;;;I"Jacoco::SAXParser#classes=; F;&[[@+0; [[@i ; F;: classes=;;;[;{;IC;"Sets the attribute classes ; T;[o;, ;-I" param; F;.I"/the value to set the attribute classes to.; T;I" value; T;/0;@G;[;I"WSets the attribute classes @param value the value to set the attribute classes to.; T;0;@G;(F;)0;@;I"/def classes=(value) @classes = value end; T;*I"def classes=(value); T; To;";#F;$;%;;;I"!Jacoco::SAXParser#initialize; F;&[[I" classes; T0; [[@i; F;:initialize;;;[;{;IC;" ; T;[o;, ;-I" return; F;.I" a new instance of SAXParser; T;0;/[I"SAXParser; F;@Y;[;@;0;@Y:@ref_tag_recurse_counti;@;I"def initialize(classes) super() @class_names = classes @classes = [] @current_class = nil @subelement_index = 0 end; T;*I"def initialize(classes); T; T:@explicitTo;";#F;$;%;;;I"$Jacoco::SAXParser#start_element; F;&[[I" name; T0[I" attrs; TI"[]; T; [[@i; F;:start_element;;;[;{;IC;" ; T;[;[;@;0;@l;3i;@;I"def start_element(name, attrs = []) case name when 'class' start_class(attrs) when 'counter' start_counter(attrs) end @subelement_index += 1 end; T;*I"(def start_element(name, attrs = []); T; T;4To;";#F;$;%;;;I"$Jacoco::SAXParser#start_counter; F;&[[I" attrs; T0; [[@i"; F;:start_counter;;;[;{;IC;" ; T;[;[;@;0;@};3i;@;I"4def start_counter(attrs) return unless !@current_class.nil? && @subelement_index == 1 counter = Jacoco::Counter.new counter.type = Hash[attrs]['type'] counter.missed = Hash[attrs]['missed'].to_i counter.covered = Hash[attrs]['covered'].to_i @current_class.counters.push(counter) end; T;*I"def start_counter(attrs); T; T;4To;";#F;$;%;;;I""Jacoco::SAXParser#start_class; F;&[[I" attrs; T0; [[@i-; F;:start_class;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"def start_class(attrs) @subelement_index = 0 return unless @class_names.include?(Hash[attrs]['name']) c = Jacoco::Class.new c.name = Hash[attrs]['name'] c.counters = [] @current_class = c @classes.push c end; T;*I"def start_class(attrs); T; T;4To;";#F;$;%;;;I"!Jacoco::SAXParser#characters; F;&[[I" string; T0; [[@i9; F;:characters;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I" def characters(string); end; T;*I"def characters(string); T; T;4To;";#F;$;%;;;I""Jacoco::SAXParser#end_element; F;&[[I" name; T0; [[@i;; F;:end_element;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"cdef end_element(name) @subelement_index -= 1 @current_class = nil if name.eql? 'class' end; T;*I"def end_element(name); T; T;4T: @owner@:@class_mixinsIC;[;:@:@instance_mixinsIC;[;:@:@attributesIC:SymbolHash{: classIC;>{:@symbolize_valueT;%IC;>{;'IC;>{: read@: write@';@T;0IC;>{;A@:;B@G;@T;@T;@T: @aliases{: @groups[; [[@i ; T;:SAXParser;;;;;[;{;IC;"CSax parser for quickly finding class elements in Jacoco report; T;[;[;I"CSax parser for quickly finding class elements in Jacoco report; T;0;@;3i;(F:@line_rangeo: Range: exclF: begini :endi ;@;I"Jacoco::SAXParser; F:@superclasso:YARD::CodeObjects::Proxy :@orignamespace@:@orignameI"!Nokogiri::XML::SAX::Document; T: @imethod0;: Document;o;L ;M@;NI"Nokogiri::XML::SAX; T;O0;:SAX;o;L ;M@;NI"Nokogiri::XML; T;O0;:XML;o;L ;M0;N0;O0;: Nokogiri;@: @obj0: @type0;T0;U0;T0;U0;T0;U;?; To;!;IC;[;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"W/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/counter.rb; Ti ; T;: Counter;;;;;[;{;IC;"Jacoco counter model; T;[;[;I"Jacoco counter model; T;0;@;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Counter; F;Ko;L ;M0;N0;O0;: Object;@;T0;U;?; To;!;IC;[;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"V/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/report.rb; Ti ; T;: Report;;;;;[;{;IC;"Jacoco report model; T;[;[;I"Jacoco report model; T;0;@;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Report; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"U/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/class.rb; Ti; T;: Class;;;;;[;{;IC;"Jacoco Class model; T;[;[;I"Jacoco Class model; T;0;@;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Class; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@ ;;IC;[;:@ ;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"V/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/method.rb; Ti ; T;: Method;;;;;[;{;IC;"Jacoco method model; T;[;[;I"Jacoco method model; T;0;@ ;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Method; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@";;IC;[;:@";{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"U/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/group.rb; Ti; T;: Group;;;;;[;{;IC;"Jacoco group model; T;[;[;I"Jacoco group model; T;0;@";3i;(F;Fo;G;HF;Ii;Ji;@;I"Jacoco::Group; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@8;;IC;[;:@8;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"Z/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/sourcefile.rb; Ti ; T;:Sourcefile;;;;;[;{;IC;"Jacoco sourcefile model; T;[;[;I"Jacoco sourcefile model; T;0;@8;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Sourcefile; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@N;;IC;[;:@N;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"\/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/session_info.rb; Ti ; T;:SessionInfo;;;;;[;{;IC;"Jacoco sessioninfo model; T;[;[;I"Jacoco sessioninfo model; T;0;@N;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::SessionInfo; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@d;;IC;[;:@d;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"T/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/line.rb; Ti; T;: Line;;;;;[;{;IC;"Jacoco line model; T;[;[;I"Jacoco line model; T;0;@d;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Line; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[;:@z;;IC;[;:@z;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[I"W/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/package.rb; Ti; T;: Package;;;;;[;{;IC;"Jacoco package model; T;[;[;I"Jacoco package model; T;0;@z;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::Package; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; To;!;IC;[ o;";#F;$;?;;;I" Jacoco::DOMParser.read_path; F;&[[I" path; T0; [[I"T/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/dom_parser.rb; Ti ; F;:read_path;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"Adef self.read_path(path) DOMParser.new.read_path(path) end; T;*I"def read_path(path); T; T;4To;";#F;$;?;;;I""Jacoco::DOMParser.read_string; F;&[[I" string; T0; [[@i; F;:read_string;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"Idef self.read_string(string) DOMParser.new.read_string(string) end; T;*I"def read_string(string); T; T;4To;";#F;$;%;;;I" Jacoco::DOMParser#read_path; F;&[[I" path; T0; [[@i; F;;b;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"Idef read_path(path) file = File.read(path) read_string(file) end; T;*I"def read_path(path); T; T;4To;";#F;$;%;;;I""Jacoco::DOMParser#read_string; F;&[[I" string; T0; [[@i; F;;c;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"7def read_string(string) Report.parse(string) end; T;*I"def read_string(string); T; T;4T;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[@i ; T;:DOMParser;;;;;[;{;IC;"!DOM parser for Jacoco report; T;[;[;I"!DOM parser for Jacoco report; T;0;@;3i;(F;Fo;G;HF;Ii ;Ji ;@;I"Jacoco::DOMParser; F;Ko;L ;M0;N0;O0;;Y;@;T0;U;?; T;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[@ i[@i [@i [@i [@i [@i [@.i [@Di [@Zi [@pi [@i [@i; F;: Jacoco;;;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I" Jacoco; Fo; ;IC;[o;!;IC;[+o;";#F;$;%;;;I"=Danger::DangerJacoco#minimum_project_coverage_percentage; F;&[; [[I"P/Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/plugin.rb; Ti; T;:(minimum_project_coverage_percentage;;;[;{;IC;"(rubocop:disable Metrics/ClassLength ; T;[;[;I"(rubocop:disable Metrics/ClassLength; T;0;@;(F;Fo;G;HF;Ii;Ji;@;I"Wdef minimum_project_coverage_percentage @minimum_project_coverage_percentage end; T;*I",def minimum_project_coverage_percentage; T; To;";#F;$;%;;;I">Danger::DangerJacoco#minimum_project_coverage_percentage=; F;&[[@+0; [[@i; T;:)minimum_project_coverage_percentage=;;;[;{;IC;"(rubocop:disable Metrics/ClassLength ; T;[;[;@;0;@ ;(F;F@;@;I"gdef minimum_project_coverage_percentage=(value) @minimum_project_coverage_percentage = value end; T;*I"4def minimum_project_coverage_percentage=(value); T; To;";#F;$;%;;;I";Danger::DangerJacoco#minimum_class_coverage_percentage; F;&[; [[@i; T;:&minimum_class_coverage_percentage;;;[;{;IC;"(rubocop:disable Metrics/ClassLength ; T;[;[;@;0;@;(F;F@;@;I"Sdef minimum_class_coverage_percentage @minimum_class_coverage_percentage end; T;*I"*def minimum_class_coverage_percentage; T; To;";#F;$;%;;;I" com/example/SomeJavaClass e.g. src/kotlin/com/example/SomeKotlinClass.kt -> com/example/SomeKotlinClass The default value supposes that you're using gradle structure, that is your path to source files is something like Java => blah/blah/java/slashed_package/Source.java Kotlin => blah/blah/kotlin/slashed_package/Source.kt rubocop:disable Style/AbcSize; T;[;[;I"This is a fast report based on SAX parser @path path to the xml output of jacoco @report_url URL where html report hosted @delimiter git.modified_files returns full paths to the changed files. We need to get the class from this path to check the Jacoco report, e.g. src/java/com/example/SomeJavaClass.java -> com/example/SomeJavaClass e.g. src/kotlin/com/example/SomeKotlinClass.kt -> com/example/SomeKotlinClass The default value supposes that you're using gradle structure, that is your path to source files is something like Java => blah/blah/java/slashed_package/Source.java Kotlin => blah/blah/kotlin/slashed_package/Source.kt rubocop:disable Style/AbcSize; T;0;@K;3i;(F;Fo;G;HF;IiA;JiR;@;I"def report(path, report_url = '', delimiter = %r{/java/|/kotlin/}, fail_no_coverage_data_found: true) @fail_no_coverage_data_found = fail_no_coverage_data_found setup classes = classes(delimiter) parser = Jacoco::SAXParser.new(classes) Nokogiri::XML::SAX::Parser.new(parser).parse(File.open(path)) total_covered = total_coverage(path) header = "### #{title} Code Coverage #{total_covered[:covered]}% #{total_covered[:status]}\n" report_markdown = header report_markdown += "| #{class_column_title} | Covered | Required | Status |\n" report_markdown += "|:---|:---:|:---:|:---:|\n" class_coverage_above_minimum = markdown_class(parser, report_markdown, report_url) subtitle = class_coverage_above_minimum ? subtitle_success : subtitle_failure report_markdown.insert(header.length, "#### #{subtitle}\n") markdown(report_markdown) report_fails(class_coverage_above_minimum, total_covered) end; T;*I"jdef report(path, report_url = '', delimiter = %r{/java/|/kotlin/}, fail_no_coverage_data_found: true); T; T;4To;";#F;$;%;;;I"!Danger::DangerJacoco#classes; F;&[[I"delimiter; T0; [[@im; T;;0;;;[;{;IC;"ySelect either only added files or modified and added files in this PR, depending on "only_check_new_files" attribute; T;[;[;I"ySelect either only added files or modified and added files in this PR, depending on "only_check_new_files" attribute; T;0;@d;3i;(F;Fo;G;HF;Iik;Jil;@;I"Jdef classes(delimiter) git = @dangerfile.git affected_files = only_check_new_files ? git.added_files : git.added_files + git.modified_files affected_files.select { |file| files_extension.reduce(false) { |state, el| state || file.end_with?(el) } } .map { |file| file.split('.').first.split(delimiter)[1] } end; T;*I"def classes(delimiter); T; T;4To;";#F;$;%;;;I"&Danger::DangerJacoco#report_class; F;&[[I"jacoco_class; T0; [[@iu; T;:report_class;;;[;{;IC;"JIt returns a specific class code coverage and an emoji status as well; T;[;[;I"JIt returns a specific class code coverage and an emoji status as well; T;0;@t;3i;(F;Fo;G;HF;Iit;Jit;@;I"hdef report_class(jacoco_class) report_result = { covered: 'No coverage data found : -', status: ':black_joker:', required_coverage_percentage: 'No coverage data found : -' } counter = coverage_counter(jacoco_class) unless counter.nil? coverage = (counter.covered.fdiv(counter.covered + counter.missed) * 100).floor required_coverage = required_class_coverage(jacoco_class) status = coverage_status(coverage, required_coverage) report_result = { covered: coverage, status: status, required_coverage_percentage: required_coverage } end report_result end; T;*I"#def report_class(jacoco_class); T; T;4To;";#F;$;%;;;I"1Danger::DangerJacoco#required_class_coverage; F;&[[I"jacoco_class; T0; [[@i; T;:required_class_coverage;;;[;{;IC;"3Determines the required coverage for the class; T;[;[;I"3Determines the required coverage for the class; T;0;@;3i;(F;Fo;G;HF;Ii;Ji;@;I"def required_class_coverage(jacoco_class) key = minimum_class_coverage_map.keys.detect { |k| jacoco_class.name.match(k) } || jacoco_class.name required_coverage = minimum_class_coverage_map[key] required_coverage = package_coverage(jacoco_class.name) if required_coverage.nil? required_coverage = minimum_class_coverage_percentage if required_coverage.nil? required_coverage end; T;*I".def required_class_coverage(jacoco_class); T; T;4To;";#F;$;%;;;I"*Danger::DangerJacoco#package_coverage; F;&[[I"class_name; T0; [[@i; T;:package_coverage;;;[;{;IC;"Jit returns the most suitable coverage by package name to class or nil; T;[;[;I"Jit returns the most suitable coverage by package name to class or nil; T;0;@;3i;(F;Fo;G;HF;Ii;Ji;@;I"Idef package_coverage(class_name) path = class_name package_parts = class_name.split('/') package_parts.reverse_each do |item| size = item.size path = path[0...-size] coverage = minimum_package_coverage_map[path] path = path[0...-1] unless path.empty? return coverage unless coverage.nil? end nil end; T;*I"%def package_coverage(class_name); T; T;4To;";#F;$;%;;;I")Danger::DangerJacoco#coverage_status; F;&[[I" coverage; T0[I"minimum_percentage; T0; [[@i; T;:coverage_status;;;[;{;IC;",it returns an emoji for coverage status; T;[;[;I",it returns an emoji for coverage status; T;0;@;3i;(F;Fo;G;HF;Ii;Ji;@;I"def coverage_status(coverage, minimum_percentage) if coverage < (minimum_percentage / 2) then ':skull:' elsif coverage < minimum_percentage then ':warning:' else ':white_check_mark:' end end; T;*I"6def coverage_status(coverage, minimum_percentage); T; T;4To;";#F;$;%;;;I"(Danger::DangerJacoco#total_coverage; F;&[[I"report_path; T0; [[@i; T;:total_coverage;;;[;{;IC;"JIt returns total of project code coverage and an emoji status as well; T;[;[;I"JIt returns total of project code coverage and an emoji status as well; T;0;@;3i;(F;Fo;G;HF;Ii;Ji;@;I"^def total_coverage(report_path) jacoco_report = Nokogiri::XML(File.open(report_path)) report = jacoco_report.xpath('report/counter').select { |item| item['type'] == 'INSTRUCTION' } missed_instructions = report.first['missed'].to_f covered_instructions = report.first['covered'].to_f total_instructions = missed_instructions + covered_instructions covered_percentage = (covered_instructions * 100 / total_instructions).round(2) coverage_status = coverage_status(covered_percentage, minimum_project_coverage_percentage) { covered: covered_percentage, status: coverage_status } end; T;*I"$def total_coverage(report_path); T; T;4To;";#F;$;%;: private;I"*Danger::DangerJacoco#coverage_counter; F;&[[I"jacoco_class; T0; [[@i; F;:coverage_counter;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"def coverage_counter(jacoco_class) all_class_counters = jacoco_class.counters counter = class_counter(all_class_counters) if counter.nil? no_coverage_data_found_message = "No coverage data found for #{jacoco_class.name}" raise no_coverage_data_found_message if @fail_no_coverage_data_found.instance_of?(TrueClass) warn no_coverage_data_found_message end counter end; T;*I"'def coverage_counter(jacoco_class); T; T;4To;";#F;$;%;;;I"'Danger::DangerJacoco#class_counter; F;&[[I"all_class_counters; T0; [[@i; F;:class_counter;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I"def class_counter(all_class_counters) instruction_counter = all_class_counters.detect { |e| e.type.eql? 'INSTRUCTION' } branch_counter = all_class_counters.detect { |e| e.type.eql? 'BRANCH' } line_counter = all_class_counters.detect { |e| e.type.eql? 'LINE' } if !instruction_counter.nil? instruction_counter elsif !branch_counter.nil? branch_counter else line_counter end end; T;*I"*def class_counter(all_class_counters); T; T;4To;";#F;$;%;;;I"&Danger::DangerJacoco#report_fails; F;&[[I"!class_coverage_above_minimum; T0[I"total_covered; T0; [[@i; T;:report_fails;;;[;{;IC;"*rubocop:disable Style/SignalException; T;[;[;I"*rubocop:disable Style/SignalException; T;0;@;3i;(F;Fo;G;HF;Ii;Ji;@;I"def report_fails(class_coverage_above_minimum, total_covered) if total_covered[:covered] < minimum_project_coverage_percentage # fail danger if total coverage is smaller than minimum_project_coverage_percentage covered = total_covered[:covered] fail("Total coverage of #{covered}%. Improve this to at least #{minimum_project_coverage_percentage}%") end return if class_coverage_above_minimum fail("Class coverage is below minimum. Improve to at least #{minimum_class_coverage_percentage}%") end; T;*I"Bdef report_fails(class_coverage_above_minimum, total_covered); T; T;4To;";#F;$;%;;;I"(Danger::DangerJacoco#markdown_class; F;&[[I" parser; T0[I"report_markdown; T0[I"report_url; T0; [[@i; T;:markdown_class;;;[;{;IC;")rubocop:enable Style/SignalException; T;[;[;I")rubocop:enable Style/SignalException; T;0;@;3i;(F;Fo;G;HF;Ii;Ji;@;I"def markdown_class(parser, report_markdown, report_url) class_coverage_above_minimum = true parser.classes.each do |jacoco_class| # Check metrics for each classes rp = report_class(jacoco_class) rl = report_link(jacoco_class.name, report_url) ln = "| #{rl} | #{rp[:covered]}% | #{rp[:required_coverage_percentage]}% | #{rp[:status]} |\n" report_markdown << ln class_coverage_above_minimum &&= rp[:covered] >= rp[:required_coverage_percentage] end class_coverage_above_minimum end; T;*I"{;?IC;>{;@T;%IC;>{;fIC;>{;A@;B@ ;@T;hIC;>{;A@;B@#;@T;jIC;>{;A@0;B@<;@T;lIC;>{;A@I;B@U;@T;nIC;>{;A@b;B@n;@T;pIC;>{;A@{;B@;@T;rIC;>{;A@;B@;@T;tIC;>{;A@;B@;@T;vIC;>{;A@;B@;@T;xIC;>{;A@;B@;@T;zIC;>{;A@;B@;@T;@T;@T;C{;D[; [[@i; T;:DangerJacoco;;;;;[;{;IC;"|Verify code coverage inside your projects This is done using the jacoco output Results are passed out as a table in markdown; T;[ o;, ;-I" example; F;.I"4jacoco.minimum_project_coverage_percentage = 50; T;I"Verify coverage; T;/0;@o;, ;-I" example; F;.I"jacoco.minimum_package_coverage_map = { # optional (default is empty) 'com/package/' => 55, 'com/package/more/specific/' => 15 }; T;I" Verify coverage per package; T;/0;@o;, ;-I"see; F;.I"Malinskiy/danger-jacoco; T;I" Anton; T;/0;@o;, ;-I" tags; F;.I",jacoco, coverage, java, android, kotlin; T;0;/0;@;[;I"Verify code coverage inside your projects This is done using the jacoco output Results are passed out as a table in markdown @example Verify coverage jacoco.minimum_project_coverage_percentage = 50 @example Verify coverage per package jacoco.minimum_package_coverage_map = { # optional (default is empty) 'com/package/' => 55, 'com/package/more/specific/' => 15 } @see Anton Malinskiy/danger-jacoco @tags jacoco, coverage, java, android, kotlin ; T;0;@;3i;(F;Fo;G;HF;Ii ;Ji;@;I"Danger::DangerJacoco; F;Ko;L ;M0;N0;O0;: Plugin;@;T0;U;?; T;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [[@i ; F;: Danger;;;;;[;{;IC;" ; T;[;[;@;0;@;3i;@;I" Danger; F;:@;;IC;[;:@;{;?IC;>{;@T;%IC;>{;@T;@T;C{;D[; [; F;;;;;;;[;{;IC;" ; T;[;[;@;0;@;3i;0;@;e@:Jacoco::VERSION@ ;@:Danger::DangerJacoco@:=Danger::DangerJacoco#minimum_project_coverage_percentage@:>Danger::DangerJacoco#minimum_project_coverage_percentage=@ :;Danger::DangerJacoco#minimum_class_coverage_percentage@: