]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5209 Show coverage
authorStas Vilchik <vilchiks@gmail.com>
Wed, 14 May 2014 13:33:02 +0000 (15:33 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Wed, 14 May 2014 13:33:08 +0000 (15:33 +0200)
sonar-server/src/main/coffee/component-viewer/header.coffee
sonar-server/src/main/coffee/component-viewer/main.coffee
sonar-server/src/main/coffee/component-viewer/source.coffee
sonar-server/src/main/hbs/component-viewer/header.hbs
sonar-server/src/main/hbs/component-viewer/source.hbs
sonar-server/src/main/less/component-viewer.less
sonar-server/src/main/less/ui.less

index e928921ab543bfa7a94f6c23c06986e5769100f4..322787ef0f62a4b28038c98e59569bc60e018a85 100644 (file)
@@ -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
index 10730ef14f1e038e3a1c432529ab7749f001158a..93d936e0729ecaad0030e446c6203241c2db5d98 100644 (file)
@@ -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) ->
index bbffc3239182bfa6dc49a5683bf24a14f598ccb7..736ad552ae9cfc9c0c99f439e7007ee5ecdee891 100644 (file)
@@ -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: ->
index 016d84dbbca1aba5f2a8f2fa9022479834bc6632..eef50ec21064bbda17f3bb27aa8091f9474ec826 100644 (file)
 
 <div data-scope="duplications" class="component-viewer-header-expanded-bar">
   {{> '_duplications-header'}}
+</div>
+
+
+
+<div class="component-viewer-header-decoration">
+  <div class="button-group">
+    <button class="js-toggle-issues {{#if settings.issues}}active{{/if}}">Issues</button>
+    <button class="js-toggle-coverage {{#if settings.coverage}}active{{/if}}">Coverage</button>
+    <button class="js-toggle-duplications {{#if settings.duplications}}active{{/if}}">Duplications</button>
+    <button class="js-toggle-scm {{#if settings.scm}}active{{/if}}">SCM</button>
+  </div>
 </div>
\ No newline at end of file
index 65d7165af2896fe9a724144bc71a6ba2e807a8d9..51b3f8fe430495095c881bf9de9b6b7bf63e38ba 100644 (file)
@@ -1,5 +1,5 @@
 <table class="code">
-  <tr class="row row-hidden" data-line-number="0">
+  <tr class="row" data-line-number="0">
     {{#if settings.coverage}}
       <td class="stat coverage-tests"></td>
       <td class="stat coverage-conditions"></td>
@@ -8,7 +8,7 @@
       <td class="stat"></td>
     {{/if}}
     {{#if settings.scm}}
-      <th class="stat"></th>
+      <td class="stat"></td>
     {{/if}}
     <td class="stat lid"></td>
     <td class="line"></td>
 
   {{#each source}}
     {{#if show}}
-      <tr class="row {{#if ../../settings.coverage}}{{#if coverageStatus}}coverage-{{coverageStatus}}{{/if}}{{/if}}"
+      <tr class="row"
           data-line-number="{{lineNumber}}">
 
-        {{#if ../../settings.coverage}}
-          <td class="stat coverage-tests">
-            {{#if coverage}}
-              <span title="Line is covered by {{coverage}} tests">{{coverage}}</span>
-            {{/if}}
-          </td>
-
-          <td class="stat coverage-conditions">
-              {{#if coverageConditions}}
-                {{#if conditions}}
-                  <span title="{{coverageConditions}} branches are covered by tests">
-                    {{coverageConditions}}/{{conditions}}
-                  </span>
-                {{/if}}
-              {{/if}}
-          </td>
-        {{/if}}
-
         {{#if ../../settings.duplications}}
           <td class="stat duplications">
             {{#each duplications}}
           </td>
         {{/if}}
 
+        {{#if ../../settings.coverage}}
+          <td class="stat coverage-tests {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
+            {{#if coverage}}
+              <span>{{coverage.testCases}}</span>
+            {{/if}}
+          </td>
+
+          <td class="stat coverage-branches {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
+            {{#if coverage}}
+              {{#if coverage.branches}}
+                <span>{{coverage.coveredBranches}}/{{coverage.branches}}</span>
+              {{/if}}
+            {{/if}}
+          </td>
+        {{/if}}
+
         <td class="stat lid">{{lineNumber}}</td>
 
         <td class="line"><pre>{{{code}}}</pre></td>
index 323590e129d5994f598ca7c7629c7ff91dea5869..8cfc3f7e6482be248acbf611c521dc8fef101728 100644 (file)
     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;
 
   }
 
-  .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%); }
     }
   }
 
   }
 }
 
+.component-viewer-header-decoration {
+  margin-top: 10px;
+}
+
 
 
 @popupArrowSize: 8px;
index b688616dc5bc75f729228388652a68ba882c7616..032359fea3d615c4c00143c5ca576b41c07a7704 100644 (file)
@@ -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;
     }
   }