From f427603edf62df1995c3c4e3dfca301b511bdf5c Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Wed, 14 May 2014 15:33:02 +0200 Subject: [PATCH] SONAR-5209 Show coverage --- .../coffee/component-viewer/header.coffee | 43 ++++++ .../main/coffee/component-viewer/main.coffee | 43 +++--- .../coffee/component-viewer/source.coffee | 136 ++++++------------ .../src/main/hbs/component-viewer/header.hbs | 11 ++ .../src/main/hbs/component-viewer/source.hbs | 40 +++--- .../src/main/less/component-viewer.less | 21 +-- sonar-server/src/main/less/ui.less | 7 +- 7 files changed, 155 insertions(+), 146 deletions(-) diff --git a/sonar-server/src/main/coffee/component-viewer/header.coffee b/sonar-server/src/main/coffee/component-viewer/header.coffee index e928921ab54..322787ef0f6 100644 --- a/sonar-server/src/main/coffee/component-viewer/header.coffee +++ b/sonar-server/src/main/coffee/component-viewer/header.coffee @@ -22,6 +22,16 @@ define [ events: 'click @ui.expandLinks': 'showExpandedBar' + 'click .js-toggle-issues': 'toggleIssues' + 'click .js-toggle-coverage': 'toggleCoverage' + 'click .js-toggle-duplications': 'toggleDuplications' + 'click .js-toggle-scm': 'toggleSCM' + + + initialize: (options) -> +# @listenTo options.main.settings, 'change', @changeSettings + options.main.settings.on 'change', => @changeSettings() + onRender: -> @delegateEvents() @@ -41,6 +51,39 @@ define [ @ui.expandedBars.filter("[data-scope=#{scope}]").show() + changeSettings: -> + @$('.js-toggle-issues').toggleClass 'active', @options.main.settings.get 'issues' + @$('.js-toggle-coverage').toggleClass 'active', @options.main.settings.get 'coverage' + @$('.js-toggle-duplications').toggleClass 'active', @options.main.settings.get 'duplications' + @$('.js-toggle-scm').toggleClass 'active', @options.main.settings.get 'scm' + + + toggleSetting: (e, show, hide) -> + @showBlocks = [] + active = $(e.currentTarget).is '.active' + if active then hide.call @options.main else show.call @options.main + + + toggleIssues: (e) -> + @toggleSetting e, @options.main.showIssues, @options.main.hideIssues + + + toggleCoverage: (e) -> + @toggleSetting e, @options.main.showCoverage, @options.main.hideCoverage + + + toggleDuplications: (e) -> + @toggleSetting e, @options.main.showDuplications, @options.main.hideDuplications + + + toggleSCM: (e) -> + @toggleSetting e, @options.main.showSCM, @options.main.hideSCM + + + toggleWorkspace: (e) -> + @toggleSetting e, @options.main.showWorkspace, @options.main.hideWorkspace + + serializeData: -> component = @options.main.component.toJSON() if component.measures diff --git a/sonar-server/src/main/coffee/component-viewer/main.coffee b/sonar-server/src/main/coffee/component-viewer/main.coffee index 10730ef14f1..93d936e0729 100644 --- a/sonar-server/src/main/coffee/component-viewer/main.coffee +++ b/sonar-server/src/main/coffee/component-viewer/main.coffee @@ -19,6 +19,7 @@ define [ $ = jQuery API_COMPONENT = "#{baseUrl}/api/sources/app" API_SOURCES = "#{baseUrl}/api/sources/show" + API_COVERAGE = "#{baseUrl}/api/coverage/show" API_SCM = "#{baseUrl}/api/sources/scm" @@ -35,6 +36,14 @@ define [ initialize: (options) -> + @settings = new Backbone.Model + issues: false + coverage: false + duplications: false + scm: false + workspace: false + @settings.set options.settings + @component = new Backbone.Model() @component.set options.component if options.component? @@ -52,14 +61,6 @@ define [ model: @source main: @ - @settings = new Backbone.Model - issues: false - coverage: false - duplications: false - scm: false - workspace: false - @settings.set options.settings - onRender: -> if @settings.get 'workspace' @@ -85,6 +86,10 @@ define [ $.get API_SCM, key: key, (data) => @source.set scm: data.scm + requestCoverage: (key) -> + $.get API_COVERAGE, key: key, (data) => + @source.set coverage: data.coverage + extractIssues: (data) -> issuesMeasures = {} @@ -115,12 +120,16 @@ define [ showCoverage: -> @settings.set 'coverage', true - @render() + unless @source.has 'coverage' + @requestCoverage(@key).done => @sourceView.render() + else + @sourceView.render() + @sourceView.render() hideCoverage: -> @settings.set 'coverage', false - @render() + @sourceView.render() showWorkspace: -> @@ -137,35 +146,35 @@ define [ @settings.set 'issues', true if _.isArray(issues) && issues.length > 0 @source.set 'issues', issues - @render() + @sourceView.render() hideIssues: -> @settings.set 'issues', false - @render() + @sourceView.render() showDuplications: -> @settings.set 'duplications', true - @render() + @sourceView.render() hideDuplications: -> @settings.set 'duplications', false - @render() + @sourceView.render() showSCM: -> @settings.set 'scm', true - unless @source.has 'duplications' + unless @source.has 'scm' @requestSCM(@key).done => @sourceView.render() else - @render() + @sourceView.render() hideSCM: -> @settings.set 'scm', false - @render() + @sourceView.render() addTransition: (key, transition, optionsForCurrent, options) -> diff --git a/sonar-server/src/main/coffee/component-viewer/source.coffee b/sonar-server/src/main/coffee/component-viewer/source.coffee index bbffc323918..736ad552ae9 100644 --- a/sonar-server/src/main/coffee/component-viewer/source.coffee +++ b/sonar-server/src/main/coffee/component-viewer/source.coffee @@ -25,16 +25,11 @@ define [ expandTemplate: Templates['code-expand'] LINES_AROUND_ISSUE = 4 + LINES_AROUND_COVERED_LINE = 1 EXPAND_LINES = 20 events: - 'click .js-toggle-settings': 'toggleSettings' - 'click .js-toggle-measures': 'toggleMeasures' - 'change #source-issues': 'toggleIssues' - 'change #source-coverage': 'toggleCoverage' - 'change #source-duplications': 'toggleDuplications' - 'change #source-workspace': 'toggleWorkspace' 'click .coverage-tests': 'showCoveragePopup' 'click .duplication-exists': 'showDuplicationPopup' @@ -103,29 +98,6 @@ define [ row.toggleClass 'component-viewer-header-full' - toggleSetting: (e, show, hide) -> - @showBlocks = [] - active = $(e.currentTarget).is ':checked' - @showSettings = true - if active then show.call @options.main else hide.call @options.main - - - toggleIssues: (e) -> - @toggleSetting e, @options.main.showIssues, @options.main.hideIssues - - - toggleCoverage: (e) -> - @toggleSetting e, @options.main.showCoverage, @options.main.hideCoverage - - - toggleDuplications: (e) -> - @toggleSetting e, @options.main.showDuplications, @options.main.hideDuplications - - - toggleWorkspace: (e) -> - @toggleSetting e, @options.main.showWorkspace, @options.main.hideWorkspace - - showCoveragePopup: (e) -> e.stopPropagation() $('body').click() @@ -186,94 +158,68 @@ define [ popup.render() - getLineCoverage: (line) -> + augmentWithCoverage: (source) -> coverage = @model.get 'coverage' - - lineCoverage = coverage? && coverage[line]? && coverage[line] - lineCoverage = +lineCoverage if _.isString lineCoverage - - lineCoverageStatus = null - if _.isNumber lineCoverage - lineCoverageStatus = 'red' if lineCoverage == 0 - lineCoverageStatus = 'green' if lineCoverage > 0 - - coverage: lineCoverage - coverageStatus: lineCoverageStatus - - - getLineCoverageConditions: (line) -> - coverageConditions = @model.get 'coverageConditions' - conditions = @model.get 'conditions' - - lineCoverageConditions = coverageConditions? && coverageConditions[line]? && coverageConditions[line] - lineCoverageConditions = +lineCoverageConditions if _.isString lineCoverageConditions - lineConditions = conditions? && conditions[line]? && conditions[line] - lineConditions = +lineConditions if _.isString lineConditions - - lineCoverageConditionsStatus = null - if _.isNumber(lineCoverageConditions) && _.isNumber(conditions) - lineCoverageConditionsStatus = 'red' if lineCoverageConditions == 0 - lineCoverageConditionsStatus = 'orange' if lineCoverageConditions > 0 && lineCoverageConditions < lineConditions - lineCoverageConditionsStatus = 'green' if lineCoverageConditions == lineConditions - - coverageConditions: lineCoverageConditions - conditions: lineConditions - coverageConditionsStatus: lineCoverageConditionsStatus - - - getLineDuplications: (line) -> - duplications = @model.get('duplications') || [] - lineDuplications = duplications.map (d) -> - d.from <= line && (d.from + d.count) > line - - duplications: lineDuplications + if coverage + coverage.forEach (s) -> + line = source[s[0] - 1] + line.coverage = + covered: s[1] + testCases: s[2] + branches: s[3] + coveredBranches: s[4] + if line.coverage.branches? && line.coverage.coveredBranches? + line.coverage.branchCoverageStatus = 'green' if line.coverage.branches == line.coverage.coveredBranches + line.coverage.branchCoverageStatus = 'orange' if line.coverage.branches > line.coverage.coveredBranches + line.coverage.branchCoverageStatus = 'red' if line.coverage.coveredBranches == 0 + source augmentWithSCM: (source) -> scm = @model.get('scm') || [] scm.forEach (s) -> - line = source[s[0]] + line = source[s[0] - 1] line.scm = author: s[1], date: s[2] source - augmentWithShow: (sourceLine) -> - show = false - line = sourceLine.lineNumber + augmentWithShow: (source) -> + source.forEach (sourceLine) => + show = false + line = sourceLine.lineNumber - @showBlocks.forEach (block) -> - if block.from <= line && block.to >= line - show = true + @showBlocks.forEach (block) -> + if block.from <= line && block.to >= line + show = true - if @options.main.settings.get('issues') && !show - @model.get('issues')?.forEach (issue) -> - if issue.line? - if (issue.line - LINES_AROUND_ISSUE) <= line && (issue.line + LINES_AROUND_ISSUE) >= line + if @options.main.settings.get('issues') && !show + @model.get('issues')?.forEach (issue) -> + currentLine = issue.line || 0 + if (currentLine - LINES_AROUND_ISSUE) <= line && (currentLine + LINES_AROUND_ISSUE) >= line show = true - if @options.main.settings.get('coverage') && !show - show = true if sourceLine.coverageStatus - - if @options.main.settings.get('duplications') && !show - sourceLine.duplications.forEach (d) -> - show = true if d + if @options.main.settings.get('coverage') && !show + @model.get('coverage')?.forEach (s) -> + currentLine = s[0] + if (currentLine - LINES_AROUND_COVERED_LINE) <= line && (currentLine + LINES_AROUND_COVERED_LINE) >= line + show = true - _.extend sourceLine, show: show + _.extend sourceLine, show: show + source prepareSource: -> source = @model.get 'source' source = _.map source, (item) => line = item[0] - base = lineNumber: line, code: item[1] - if @options.main.settings.get('coverage') - _.extend base, @getLineCoverage(line), @getLineCoverageConditions(line) - if @options.main.settings.get('duplications') - _.extend base, @getLineDuplications(line) - @augmentWithShow base - if @options.main.settings.get('scm') + lineNumber: line, code: item[1] + + if @options.main.settings.get 'coverage' + source = @augmentWithCoverage source + if @options.main.settings.get 'scm' source = @augmentWithSCM source - source + + @augmentWithShow source getStatColumnsCount: -> diff --git a/sonar-server/src/main/hbs/component-viewer/header.hbs b/sonar-server/src/main/hbs/component-viewer/header.hbs index 016d84dbbca..eef50ec2106 100644 --- a/sonar-server/src/main/hbs/component-viewer/header.hbs +++ b/sonar-server/src/main/hbs/component-viewer/header.hbs @@ -96,4 +96,15 @@
{{> '_duplications-header'}} +
+ + + +
+
+ + + + +
\ No newline at end of file diff --git a/sonar-server/src/main/hbs/component-viewer/source.hbs b/sonar-server/src/main/hbs/component-viewer/source.hbs index 65d7165af28..51b3f8fe430 100644 --- a/sonar-server/src/main/hbs/component-viewer/source.hbs +++ b/sonar-server/src/main/hbs/component-viewer/source.hbs @@ -1,5 +1,5 @@ - + {{#if settings.coverage}} @@ -8,7 +8,7 @@ {{/if}} {{#if settings.scm}} - + {{/if}} @@ -16,27 +16,9 @@ {{#each source}} {{#if show}} - - {{#if ../../settings.coverage}} - - - - {{/if}} - {{#if ../../settings.duplications}} {{/if}} + {{#if ../../settings.coverage}} + + + + {{/if}} + diff --git a/sonar-server/src/main/less/component-viewer.less b/sonar-server/src/main/less/component-viewer.less index 323590e129d..8cfc3f7e648 100644 --- a/sonar-server/src/main/less/component-viewer.less +++ b/sonar-server/src/main/less/component-viewer.less @@ -125,8 +125,6 @@ vertical-align: top; min-width: 12px; padding: 1px 5px; - border-left: 1px solid @barBorderColor; - border-right: 1px solid @barBorderColor; background-color: @barBackgroundColor; color: #888; font-size: 11px; @@ -209,22 +207,21 @@ } - .code .row { + .code .stat { - &.coverage-green td.stat { + &.coverage-green { background-color: lighten(@green, 15%); - border-color: lighten(@green, 7%); color: @baseFontColor; + } - &.lid { border-right-color: lighten(@green, 15%); } + &.coverage-orange { + background-color: lighten(@orange, 15%); + color: @baseFontColor; } - &.coverage-red td.stat { + &.coverage-red { background-color: lighten(@red, 15%); - border-color: lighten(@red, 10%); color: @baseFontColor; - - &.lid { border-right-color: lighten(@red, 15%); } } } @@ -425,6 +422,10 @@ } } +.component-viewer-header-decoration { + margin-top: 10px; +} + @popupArrowSize: 8px; diff --git a/sonar-server/src/main/less/ui.less b/sonar-server/src/main/less/ui.less index b688616dc5b..032359fea3d 100644 --- a/sonar-server/src/main/less/ui.less +++ b/sonar-server/src/main/less/ui.less @@ -55,13 +55,13 @@ input[type=button] { outline: none; .trans(border-color); - &:hover { + &:hover, &.active { border-color: #5281a0; background: #4b9fd5; color: #fff; } - &:active, &.active { + &:active { border-color: #2790c0; background: #78bdea; color: #fff; @@ -98,6 +98,7 @@ input[type=button] { .button-clean, .button-clean:hover, .button-clean:focus { + margin: 0; padding: 0; border: none; background: transparent; @@ -121,7 +122,7 @@ input[type=button] { font-weight: normal; cursor: pointer; - &:hover, &:focus { + &:hover, &:focus, &:active, &.active { z-index: 3; } } -- 2.39.5
- {{#if coverage}} - {{coverage}} - {{/if}} - - {{#if coverageConditions}} - {{#if conditions}} - - {{coverageConditions}}/{{conditions}} - - {{/if}} - {{/if}} - {{#each duplications}} @@ -54,6 +36,22 @@ + {{#if coverage}} + {{coverage.testCases}} + {{/if}} + + {{#if coverage}} + {{#if coverage.branches}} + {{coverage.coveredBranches}}/{{coverage.branches}} + {{/if}} + {{/if}} + {{lineNumber}}
{{{code}}}