import { MetricKey, MetricType } from '~sonar-aligned/types/metrics';
import { isDiffMetric } from '../../../helpers/measures';
import { mockMeasure } from '../../../helpers/testMocks';
-import { SoftwareImpactSeverity } from '../../../types/clean-code-taxonomy';
import { IssueDeprecatedStatus, IssueType, RawIssue } from '../../../types/issues';
import { Measure } from '../../../types/types';
import { ComponentTree } from './components';
value: 'java=10000;javascript=5000;css=1000',
});
- case MetricKey.security_issues:
+ case MetricKey.software_quality_security_issues:
return mockMeasure({
metric: metricKey,
- value: JSON.stringify({
- total: 1,
- [SoftwareImpactSeverity.High]: 0,
- [SoftwareImpactSeverity.Medium]: 1,
- [SoftwareImpactSeverity.Low]: 0,
- }),
+ value: '1',
});
- case MetricKey.new_security_issues:
+ case MetricKey.new_software_quality_security_issues:
return mockMeasure({
metric: metricKey,
period: {
index: 1,
- value: JSON.stringify({
- total: 3,
- [SoftwareImpactSeverity.High]: 2,
- [SoftwareImpactSeverity.Medium]: 0,
- [SoftwareImpactSeverity.Low]: 1,
- }),
+ value: '3',
},
value: undefined,
});
- case MetricKey.reliability_issues:
+ case MetricKey.software_quality_reliability_issues:
return mockMeasure({
metric: metricKey,
- value: JSON.stringify({
- total: 3,
- [SoftwareImpactSeverity.High]: 0,
- [SoftwareImpactSeverity.Medium]: 2,
- [SoftwareImpactSeverity.Low]: 1,
- }),
+ value: '3',
});
- case MetricKey.new_reliability_issues:
+ case MetricKey.new_software_quality_reliability_issues:
return mockMeasure({
metric: metricKey,
period: {
index: 1,
- value: JSON.stringify({
- total: 2,
- [SoftwareImpactSeverity.High]: 0,
- [SoftwareImpactSeverity.Medium]: 1,
- [SoftwareImpactSeverity.Low]: 1,
- }),
+ value: '2',
},
value: undefined,
});
- case MetricKey.maintainability_issues:
+ case MetricKey.software_quality_maintainability_issues:
return mockMeasure({
metric: metricKey,
- value: JSON.stringify({
- total: 2,
- [SoftwareImpactSeverity.High]: 0,
- [SoftwareImpactSeverity.Medium]: 0,
- [SoftwareImpactSeverity.Low]: 1,
- }),
+ value: '2',
});
- case MetricKey.new_maintainability_issues:
+ case MetricKey.new_software_quality_maintainability_issues:
return mockMeasure({
metric: metricKey,
period: {
index: 1,
- value: JSON.stringify({
- total: 5,
- [SoftwareImpactSeverity.High]: 2,
- [SoftwareImpactSeverity.Medium]: 2,
- [SoftwareImpactSeverity.Low]: 1,
- }),
+ value: '5',
},
value: undefined,
});
return MetricType.Percent;
} else if (metricKey.includes('_rating')) {
return MetricType.Rating;
- } else if (
- [
- MetricKey.reliability_issues,
- MetricKey.new_reliability_issues,
- MetricKey.security_issues,
- MetricKey.new_security_issues,
- MetricKey.maintainability_issues,
- MetricKey.new_maintainability_issues,
- ].includes(metricKey as MetricKey)
- ) {
- return MetricType.Data;
}
return MetricType.Integer;
}
const folderRow = ui.measureRow(/folderA/);
[
[MetricKey.ncloc, '2'],
- [MetricKey.security_issues, '4'],
- [MetricKey.reliability_issues, '4'],
- [MetricKey.maintainability_issues, '4'],
+ [MetricKey.software_quality_security_issues, '4'],
+ [MetricKey.software_quality_reliability_issues, '4'],
+ [MetricKey.software_quality_maintainability_issues, '4'],
[MetricKey.security_hotspots, '2'],
[MetricKey.coverage, '2.0%'],
[MetricKey.duplicated_lines_density, '2.0%'],
const fileRow = ui.measureRow(/index\.tsx/);
[
[MetricKey.ncloc, '—'],
- [MetricKey.security_issues, '—'],
- [MetricKey.reliability_issues, '—'],
- [MetricKey.maintainability_issues, '—'],
+ [MetricKey.software_quality_security_issues, '—'],
+ [MetricKey.software_quality_reliability_issues, '—'],
+ [MetricKey.software_quality_maintainability_issues, '—'],
[MetricKey.security_hotspots, '—'],
[MetricKey.coverage, '—'],
[MetricKey.duplicated_lines_density, '—'],
const folderRow = ui.measureRow(/folderA/);
[
[MetricKey.ncloc, '2'],
- [MetricKey.security_issues, '2'],
- [MetricKey.reliability_issues, '2'],
- [MetricKey.maintainability_issues, '2'],
+ [MetricKey.software_quality_security_issues, '2'],
+ [MetricKey.software_quality_reliability_issues, '2'],
+ [MetricKey.software_quality_maintainability_issues, '2'],
[MetricKey.security_hotspots, '2'],
[MetricKey.coverage, '2.0%'],
[MetricKey.duplicated_lines_density, '2.0%'],
const fileRow = ui.measureRow(/index\.tsx/);
[
[MetricKey.ncloc, '—'],
- [MetricKey.security_issues, '—'],
- [MetricKey.reliability_issues, '—'],
- [MetricKey.maintainability_issues, '—'],
+ [MetricKey.software_quality_security_issues, '—'],
+ [MetricKey.software_quality_reliability_issues, '—'],
+ [MetricKey.software_quality_maintainability_issues, '—'],
[MetricKey.security_hotspots, '—'],
[MetricKey.coverage, '—'],
[MetricKey.duplicated_lines_density, '—'],
return keyBy(
[
...[
- MetricKey.security_issues,
- MetricKey.reliability_issues,
- MetricKey.maintainability_issues,
- ].map((metric) =>
- mockMeasure({ metric, value: JSON.stringify({ total: 4 }), period: undefined }),
- ),
+ MetricKey.software_quality_security_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_maintainability_issues,
+ ].map((metric) => mockMeasure({ metric, value: '4', period: undefined })),
...[
MetricKey.ncloc,
MetricKey.new_lines,
[
"alert_status",
"ncloc",
- "security_issues",
- "reliability_issues",
- "maintainability_issues",
+ "software_quality_security_issues",
+ "software_quality_reliability_issues",
+ "software_quality_maintainability_issues",
"vulnerabilities",
"bugs",
"code_smells",
exports[`getCodeMetrics should return the right metrics for projects 1`] = `
[
"ncloc",
- "security_issues",
- "reliability_issues",
- "maintainability_issues",
+ "software_quality_security_issues",
+ "software_quality_reliability_issues",
+ "software_quality_maintainability_issues",
"vulnerabilities",
"bugs",
"code_smells",
exports[`getCodeMetrics should return the right metrics for projects 2`] = `
[
"new_lines",
- "security_issues",
- "reliability_issues",
- "maintainability_issues",
+ "software_quality_security_issues",
+ "software_quality_reliability_issues",
+ "software_quality_maintainability_issues",
"vulnerabilities",
"bugs",
"code_smells",
import { MetricKey, MetricType } from '~sonar-aligned/types/metrics';
import RatingComponent from '../../../app/components/metrics/RatingComponent';
import { getLeakValue } from '../../../components/measure/utils';
-import {
- CCT_SOFTWARE_QUALITY_METRICS,
- OLD_TO_NEW_TAXONOMY_METRICS_MAP,
-} from '../../../helpers/constants';
+import { OLD_TO_NEW_TAXONOMY_METRICS_MAP } from '../../../helpers/constants';
import {
areCCTMeasuresComputed as areCCTMeasuresComputedFn,
isDiffMetric,
metric: Metric;
}
-export default function ComponentMeasure(props: Props) {
+export default function ComponentMeasure(props: Readonly<Props>) {
const { component, metric, branchLike } = props;
const isProjectLike = isProject(component.qualifier) || isApplication(component.qualifier);
const { data: isStandardMode } = useStandardExperienceMode();
? component.measures.find((measure) => measure.metric === finalMetricKey)
: undefined;
- let value;
- if (
- measure?.value !== undefined &&
- CCT_SOFTWARE_QUALITY_METRICS.includes(measure.metric as MetricKey)
- ) {
- value = JSON.parse(measure.value).total;
- } else {
- value = isDiffMetric(metric.key) ? getLeakValue(measure) : measure?.value;
- }
+ const value = isDiffMetric(metric.key) ? getLeakValue(measure) : measure?.value;
switch (finalMetricType) {
case MetricType.Level: {
// Check one of the domains.
await user.click(ui.maintainabilityDomainBtn.get());
[
- 'component_measures.metric.new_maintainability_issues.name 5',
+ 'component_measures.metric.new_software_quality_maintainability_issues.name 5',
'Added Technical Debt work_duration.x_minutes.1',
'Technical Debt Ratio on New Code 1.0%',
'Maintainability Rating on New Code metric.has_rating_X.D metric.software_quality_maintainability_rating.tooltip.D.0.0%',
- 'component_measures.metric.maintainability_issues.name 2',
+ 'component_measures.metric.software_quality_maintainability_issues.name 2',
'Technical Debt work_duration.x_minutes.1',
'Technical Debt Ratio 1.0%',
'Maintainability Rating metric.has_rating_X.D metric.software_quality_maintainability_rating.tooltip.D.0.0%',
});
it('should correctly revert to old measures when analysis is missing', async () => {
- measuresHandler.deleteComponentMeasure('foo', MetricKey.maintainability_issues);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.new_maintainability_issues);
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.software_quality_maintainability_issues,
+ );
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.new_software_quality_maintainability_issues,
+ );
measuresHandler.deleteComponentMeasure(
'foo',
MetricKey.software_quality_maintainability_rating,
// Check one of the domains.
await user.click(ui.maintainabilityDomainBtn.get());
[
- 'component_measures.metric.new_maintainability_issues.name 5',
+ 'component_measures.metric.new_software_quality_maintainability_issues.name 5',
'Added Technical Debt work_duration.x_minutes.1',
'Technical Debt Ratio on New Code 1.0%',
'Maintainability Rating on New Code metric.has_rating_X.E metric.sqale_rating.tooltip.E.0.0%',
- 'component_measures.metric.maintainability_issues.name 2',
+ 'component_measures.metric.software_quality_maintainability_issues.name 2',
'Technical Debt work_duration.x_minutes.1',
'Technical Debt Ratio 1.0%',
'Maintainability Rating metric.has_rating_X.E metric.sqale_rating.tooltip.E.0.0%',
it('should correctly render a link to the activity page', async () => {
const { ui, user } = getPageObject();
- renderMeasuresApp('component_measures?id=foo&metric=new_maintainability_issues');
+ renderMeasuresApp(
+ 'component_measures?id=foo&metric=new_software_quality_maintainability_issues',
+ );
await ui.appLoaded();
expect(ui.goToActivityLink.query()).not.toBeInTheDocument();
await user.click(
- ui.measureLink('component_measures.metric.maintainability_issues.name 2').get(),
+ ui
+ .measureLink('component_measures.metric.software_quality_maintainability_issues.name 2')
+ .get(),
);
expect(ui.goToActivityLink.get()).toHaveAttribute(
'href',
- '/project/activity?id=foo&graph=custom&custom_metrics=maintainability_issues',
+ '/project/activity?id=foo&graph=custom&custom_metrics=software_quality_maintainability_issues',
);
});
await user.click(ui.maintainabilityDomainBtn.get());
await user.click(
- ui.measureLink('component_measures.metric.maintainability_issues.name 2').get(),
+ ui
+ .measureLink('component_measures.metric.software_quality_maintainability_issues.name 2')
+ .get(),
);
expect(
within(ui.measuresRow('folderA').get()).getByRole('cell', { name: '2' }),
await user.click(ui.maintainabilityDomainBtn.get());
await user.click(
- ui.measureLink('component_measures.metric.maintainability_issues.name 2').get(),
+ ui
+ .measureLink('component_measures.metric.software_quality_maintainability_issues.name 2')
+ .get(),
);
// Click list option in view select
// Drilldown to the file level.
await user.click(ui.maintainabilityDomainBtn.get());
await user.click(
- ui.measureLink('component_measures.metric.maintainability_issues.name 2').get(),
+ ui
+ .measureLink('component_measures.metric.software_quality_maintainability_issues.name 2')
+ .get(),
);
await ui.arrowDown(); // Select the 1st element ("folderA")
});
it('should redirect old metric route', async () => {
- measuresHandler.deleteComponentMeasure('foo', MetricKey.maintainability_issues);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.new_maintainability_issues);
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.software_quality_maintainability_issues,
+ );
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.new_software_quality_maintainability_issues,
+ );
const { ui } = getPageObject();
renderMeasuresApp('component_measures/metric/bugs?id=foo');
renderMeasuresApp('component_measures/metric/security_issues?id=foo');
await ui.appLoaded();
expect(
- ui.measureLink('component_measures.metric.security_issues.name 1').get(),
+ ui.measureLink('component_measures.metric.software_quality_security_issues.name 1').get(),
).toHaveAttribute('aria-current', 'true');
});
it('should redirect old domain route', async () => {
- measuresHandler.deleteComponentMeasure('foo', MetricKey.maintainability_issues);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.new_maintainability_issues);
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.software_quality_maintainability_issues,
+ );
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.new_software_quality_maintainability_issues,
+ );
const { ui } = getPageObject();
renderMeasuresApp('component_measures/domain/bugs?id=foo');
import { SOFTWARE_QUALITY_RATING_METRICS_MAP } from '../../../helpers/constants';
import { KeyboardKeys } from '../../../helpers/keycodes';
import { translate } from '../../../helpers/l10n';
-import { getCCTMeasureValue, isDiffMetric } from '../../../helpers/measures';
+import { isDiffMetric } from '../../../helpers/measures';
import { RequestData } from '../../../helpers/request';
import { isDefined } from '../../../helpers/types';
import { getProjectUrl } from '../../../helpers/urls';
const measures = measuresData?.component.measures ?? [];
const measure = measures.find((m) => m.metric === requestedMetric.key);
const secondaryMeasure = measures.find((m) => m.metric !== requestedMetric.key);
- const rawMeasureValue =
+ const measureValue =
measure && (isDiffMetric(measure.metric) ? measure.period?.value : measure.value);
- const measureValue = getCCTMeasureValue(metric.key, rawMeasureValue);
const isFileComponent = isFile(baseComponent.qualifier);
const paging = treeData?.pages[treeData?.pages.length - 1].paging;
Reliability: {
x: MetricKey.ncloc,
y: MetricKey.software_quality_reliability_remediation_effort,
- size: MetricKey.reliability_issues,
+ size: MetricKey.software_quality_reliability_issues,
colors: [MetricKey.software_quality_reliability_rating],
},
Security: {
x: MetricKey.ncloc,
y: MetricKey.software_quality_security_remediation_effort,
- size: MetricKey.security_issues,
+ size: MetricKey.software_quality_security_issues,
colors: [MetricKey.software_quality_security_rating],
},
Maintainability: {
x: MetricKey.ncloc,
y: MetricKey.software_quality_maintainability_remediation_effort,
- size: MetricKey.maintainability_issues,
+ size: MetricKey.software_quality_maintainability_issues,
colors: [MetricKey.software_quality_maintainability_rating],
},
Coverage: {
Reliability: {
x: MetricKey.ncloc,
y: MetricKey.reliability_remediation_effort,
- size: MetricKey.reliability_issues,
+ size: MetricKey.software_quality_reliability_issues,
colors: [MetricKey.reliability_rating],
},
Security: {
x: MetricKey.ncloc,
y: MetricKey.security_remediation_effort,
- size: MetricKey.security_issues,
+ size: MetricKey.software_quality_security_issues,
colors: [MetricKey.security_rating],
},
Maintainability: {
x: MetricKey.ncloc,
y: MetricKey.sqale_index,
- size: MetricKey.maintainability_issues,
+ size: MetricKey.software_quality_maintainability_issues,
colors: [MetricKey.sqale_rating],
},
Coverage: {
categories: [NEW_CODE_CATEGORY, OVERALL_CATEGORY],
order: [
NEW_CODE_CATEGORY,
- MetricKey.new_reliability_issues,
+ MetricKey.new_software_quality_reliability_issues,
MetricKey.new_bugs,
MetricKey.new_reliability_rating,
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.new_reliability_rating],
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.new_reliability_remediation_effort],
OVERALL_CATEGORY,
- MetricKey.reliability_issues,
+ MetricKey.software_quality_reliability_issues,
MetricKey.bugs,
MetricKey.reliability_rating,
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.reliability_rating],
categories: [NEW_CODE_CATEGORY, OVERALL_CATEGORY],
order: [
NEW_CODE_CATEGORY,
- MetricKey.new_security_issues,
+ MetricKey.new_software_quality_security_issues,
MetricKey.new_vulnerabilities,
MetricKey.new_security_rating,
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.new_security_rating],
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.new_security_remediation_effort],
OVERALL_CATEGORY,
- MetricKey.security_issues,
+ MetricKey.software_quality_security_issues,
MetricKey.vulnerabilities,
MetricKey.security_rating,
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.security_rating],
categories: [NEW_CODE_CATEGORY, OVERALL_CATEGORY],
order: [
NEW_CODE_CATEGORY,
- MetricKey.new_maintainability_issues,
+ MetricKey.new_software_quality_maintainability_issues,
MetricKey.new_code_smells,
MetricKey.new_technical_debt,
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.new_technical_debt],
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.new_maintainability_rating],
OVERALL_CATEGORY,
- MetricKey.maintainability_issues,
+ MetricKey.software_quality_maintainability_issues,
MetricKey.code_smells,
MetricKey.sqale_index,
SOFTWARE_QUALITY_RATING_METRICS_MAP[MetricKey.sqale_index],
},
Complexity: {
- order: ['complexity', 'function_complexity', 'file_complexity', 'class_complexity'],
+ order: [
+ MetricKey.complexity,
+ MetricKey.function_complexity,
+ MetricKey.file_complexity,
+ MetricKey.class_complexity,
+ ],
},
Releasability: {
- order: ['releasability_rating', 'releasability_effort', 'alert_status'],
+ order: [MetricKey.releasability_rating, MetricKey.releasability_effort, MetricKey.alert_status],
},
Issues: {
translate,
translateWithParameters,
} from '../../../helpers/l10n';
-import { getCCTMeasureValue, isDiffMetric } from '../../../helpers/measures';
+import { isDiffMetric } from '../../../helpers/measures';
import { isDefined } from '../../../helpers/types';
import { getComponentDrilldownUrl } from '../../../helpers/urls';
import { BranchLike } from '../../../types/branch-like';
if (!measure) {
return undefined;
}
- return Number(
- getCCTMeasureValue(metric.key, isDiffMetric(metric.key) ? measure.leak : measure.value),
- );
+ return Number(isDiffMetric(metric.key) ? measure.leak : measure.value);
};
const getTooltip = (
import { NumericalCell } from '~design-system';
import Measure from '~sonar-aligned/components/measure/Measure';
-import { getCCTMeasureValue, isDiffMetric } from '../../../helpers/measures';
+import { isDiffMetric } from '../../../helpers/measures';
import { BranchLike } from '../../../types/branch-like';
import { ComponentMeasureEnhanced, MeasureEnhanced, Metric } from '../../../types/types';
const getValue = (item: { leak?: string; value?: string }) =>
isDiffMetric(metric.key) ? item.leak : item.value;
- const rawValue = getValue(measure || component);
- const value = getCCTMeasureValue(metric.key, rawValue);
+ const value = getValue(measure || component);
return (
<NumericalCell className="sw-py-3">
import { Navigate, Route, useParams, useSearchParams } from 'react-router-dom';
import { lazyLoadComponent } from '~sonar-aligned/helpers/lazyLoadComponent';
import { searchParamsToQuery } from '~sonar-aligned/helpers/router';
+import { MetricKey } from '~sonar-aligned/types/metrics';
import NavigateWithParams from '../../app/utils/NavigateWithParams';
+import { SOFTWARE_QUALITIES_ISSUES_KEYS_MAP } from '../../helpers/constants';
import { omitNil } from '../../helpers/request';
const ComponentMeasuresApp = lazyLoadComponent(() => import('./components/ComponentMeasuresApp'));
pathname="/component_measures"
transformParams={(params) =>
omitNil({
- metric: params['domainName'],
+ metric:
+ SOFTWARE_QUALITIES_ISSUES_KEYS_MAP[params['domainName'] as MetricKey] ??
+ params['domainName'],
})
}
/>
search: new URLSearchParams(
omitNil({
...searchParamsToQuery(searchParams),
- metric: params.metricKey,
+ metric:
+ SOFTWARE_QUALITIES_ISSUES_KEYS_MAP[params.metricKey as MetricKey] ?? params.metricKey,
view: params.view,
}),
).toString(),
import { useStandardExperienceMode } from '../../../queries/settings';
import { Domain } from '../../../types/measures';
import { MeasureEnhanced } from '../../../types/types';
-import { PROJECT_OVERVEW, Query, isProjectOverview, populateDomainsFromMeasures } from '../utils';
+import { PROJECT_OVERVIEW, Query, isProjectOverview, populateDomainsFromMeasures } from '../utils';
import DomainSubnavigation from './DomainSubnavigation';
interface Props {
);
const handleProjectOverviewClick = () => {
- handleChangeMetric(PROJECT_OVERVEW);
+ handleChangeMetric(PROJECT_OVERVIEW);
};
const distanceFromBottom = topScroll + window.innerHeight - document.body.scrollHeight;
ariaCurrent={isProjectOverview(selectedMetric)}
onClick={handleProjectOverviewClick}
>
- {translate('component_measures.overview', PROJECT_OVERVEW, 'subnavigation')}
+ {translate('component_measures.overview', PROJECT_OVERVIEW, 'subnavigation')}
</SubnavigationItem>
</SubnavigationGroup>
areCCTMeasuresComputed,
areLeakCCTMeasuresComputed,
areSoftwareQualityRatingsComputed,
- getCCTMeasureValue,
getDisplayMetrics,
isDiffMetric,
MEASURES_REDIRECTION,
import { domains } from './config/domains';
export const BUBBLES_FETCH_LIMIT = 500;
-export const PROJECT_OVERVEW = 'project_overview';
+export const PROJECT_OVERVIEW = 'project_overview';
export const DEFAULT_VIEW = MeasurePageView.tree;
-export const DEFAULT_METRIC = PROJECT_OVERVEW;
+export const DEFAULT_METRIC = PROJECT_OVERVIEW;
export const KNOWN_DOMAINS = [
'Releasability',
'Security',
.filter((measure) => !DEPRECATED_METRICS.includes(measure.metric.key as MetricKey))
.map((measure) => {
const isDiff = isDiffMetric(measure.metric.key);
- const calculatedValue = getCCTMeasureValue(
- measure.metric.key,
- isDiff ? measure.leak : measure.value,
- );
+ const calculatedValue = isDiff ? measure.leak : measure.value;
return {
...measure,
}
export function isProjectOverview(metric: string) {
- return metric === PROJECT_OVERVEW;
+ return metric === PROJECT_OVERVIEW;
}
function parseView(metric: MetricKey, rawView?: string): MeasurePageView {
import { isDefined } from '../../../helpers/types';
import { useStandardExperienceMode } from '../../../queries/settings';
import { Branch } from '../../../types/branch-like';
-import { SoftwareImpactMeasureData, SoftwareQuality } from '../../../types/clean-code-taxonomy';
+import { SoftwareQuality } from '../../../types/clean-code-taxonomy';
import { QualityGateStatusConditionEnhanced } from '../../../types/quality-gates';
import { Component, MeasureEnhanced } from '../../../types/types';
import { Status, softwareQualityToMeasure } from '../utils';
// Find measure for this software quality
const metricKey = softwareQualityToMeasure(softwareQuality);
- const measureRaw = measures.find((m) => m.metric.key === metricKey);
- const measure = isStandardMode
- ? undefined
- : (JSON.parse(measureRaw?.value ?? 'null') as SoftwareImpactMeasureData);
+ const measure = isStandardMode ? undefined : measures.find((m) => m.metric.key === metricKey);
const alternativeMeasure = measures.find(
(m) => m.metric.key === SOFTWARE_QUALITIES_METRIC_KEYS_MAP[softwareQuality].deprecatedMetric,
);
-
- const count = formatMeasure(measure?.total ?? alternativeMeasure?.value, MetricType.ShortInteger);
+ const count = formatMeasure(measure?.value ?? alternativeMeasure?.value, MetricType.ShortInteger);
const totalLinkHref = getComponentIssuesUrl(component.key, {
...DEFAULT_ISSUES_QUERY,
it('should render old measures if software impact are missing', async () => {
// Make as if new analysis after upgrade is missing
- measuresHandler.deleteComponentMeasure('foo', MetricKey.maintainability_issues);
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.software_quality_maintainability_issues,
+ );
measuresHandler.deleteComponentMeasure(
'foo',
MetricKey.software_quality_maintainability_rating,
);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.security_issues);
+ measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_security_issues);
measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_security_rating);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.reliability_issues);
+ measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_reliability_issues);
measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_reliability_rating);
const { user, ui } = getPageObjects();
it('should render missing software impact measure cards if both software qualities and old measures are missing', async () => {
// Make as if no measures at all
- measuresHandler.deleteComponentMeasure('foo', MetricKey.maintainability_issues);
+ measuresHandler.deleteComponentMeasure(
+ 'foo',
+ MetricKey.software_quality_maintainability_issues,
+ );
measuresHandler.deleteComponentMeasure('foo', MetricKey.code_smells);
measuresHandler.deleteComponentMeasure(
'foo',
MetricKey.software_quality_maintainability_rating,
);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.security_issues);
+ measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_security_issues);
measuresHandler.deleteComponentMeasure('foo', MetricKey.vulnerabilities);
measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_security_rating);
- measuresHandler.deleteComponentMeasure('foo', MetricKey.reliability_issues);
+ measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_reliability_issues);
measuresHandler.deleteComponentMeasure('foo', MetricKey.bugs);
measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_reliability_rating);
});
it.each([
- ['security_issues', MetricKey.security_issues],
- ['reliability_issues', MetricKey.reliability_issues],
- ['maintainability_issues', MetricKey.maintainability_issues],
+ [MetricKey.software_quality_security_issues],
+ [MetricKey.software_quality_reliability_issues],
+ [MetricKey.software_quality_maintainability_issues],
])(
'should display info about missing analysis if a project is not computed for %s',
async (missingMetricKey) => {
- measuresHandler.deleteComponentMeasure('foo', missingMetricKey as MetricKey);
+ measuresHandler.deleteComponentMeasure('foo', missingMetricKey);
const { user, ui } = getPageObjects();
renderBranchOverview();
});
it.each([
- ['security_issues', MetricKey.security_issues],
- ['reliability_issues', MetricKey.reliability_issues],
- ['maintainability_issues', MetricKey.maintainability_issues],
+ [MetricKey.software_quality_security_issues],
+ [MetricKey.software_quality_reliability_issues],
+ [MetricKey.software_quality_maintainability_issues],
])(
'should ask to reanalyze all projects if a project is not computed for %s',
async (missingMetricKey) => {
MetricKey.accepted_issues,
MetricKey.new_accepted_issues,
MetricKey.high_impact_accepted_issues,
- MetricKey.maintainability_issues,
- MetricKey.reliability_issues,
- MetricKey.security_issues,
+ MetricKey.software_quality_maintainability_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_security_issues,
// bugs
MetricKey.bugs,
];
export function softwareQualityToMeasure(softwareQuality: SoftwareQuality): MetricKey {
- return (softwareQuality.toLowerCase() + '_issues') as MetricKey;
+ return `software_quality_${softwareQuality.toLowerCase()}_issues` as MetricKey;
}
export function getIssueRatingName(type: IssueType) {
MetricKey.sqale_rating,
MetricKey.security_hotspots_reviewed,
MetricKey.security_review_rating,
- MetricKey.maintainability_issues,
+ MetricKey.software_quality_maintainability_issues,
].map((metric) =>
mockMeasureHistory({
metric,
) {
const { analysisDate, isFavorite, key, measures, name, qualifier, tags, visibility } = project;
const noSoftwareQualityMetrics = [
- MetricKey.reliability_issues,
- MetricKey.maintainability_issues,
- MetricKey.security_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_maintainability_issues,
+ MetricKey.software_quality_security_issues,
].every((key) => measures[key] === undefined);
const noRatingMetrics = [
MetricKey.software_quality_reliability_rating,
: [
{
iconLabel: translate(
- `metric.${isStandardMode ? MetricKey.vulnerabilities : MetricKey.security_issues}.short_name`,
+ `metric.${isStandardMode ? MetricKey.vulnerabilities : MetricKey.software_quality_security_issues}.short_name`,
),
noShrink: true,
metricKey:
- isStandardMode || measures[MetricKey.security_issues] === undefined
+ isStandardMode || measures[MetricKey.software_quality_security_issues] === undefined
? MetricKey.vulnerabilities
- : MetricKey.security_issues,
+ : MetricKey.software_quality_security_issues,
metricRatingKey: MetricKey.security_rating,
metricType: MetricType.ShortInteger,
},
{
iconLabel: translate(
- `metric.${isStandardMode ? MetricKey.bugs : MetricKey.reliability_issues}.short_name`,
+ `metric.${isStandardMode ? MetricKey.bugs : MetricKey.software_quality_reliability_issues}.short_name`,
),
metricKey:
- isStandardMode || measures[MetricKey.reliability_issues] === undefined
+ isStandardMode || measures[MetricKey.software_quality_reliability_issues] === undefined
? MetricKey.bugs
- : MetricKey.reliability_issues,
+ : MetricKey.software_quality_reliability_issues,
metricRatingKey: MetricKey.reliability_rating,
metricType: MetricType.ShortInteger,
},
{
iconLabel: translate(
- `metric.${isStandardMode ? MetricKey.code_smells : MetricKey.maintainability_issues}.short_name`,
+ `metric.${isStandardMode ? MetricKey.code_smells : MetricKey.software_quality_maintainability_issues}.short_name`,
),
metricKey:
- isStandardMode || measures[MetricKey.maintainability_issues] === undefined
+ isStandardMode ||
+ measures[MetricKey.software_quality_maintainability_issues] === undefined
? MetricKey.code_smells
- : MetricKey.maintainability_issues,
+ : MetricKey.software_quality_maintainability_issues,
metricRatingKey: MetricKey.sqale_rating,
metricType: MetricType.ShortInteger,
},
const measureList = [
...measuresByCodeLeak,
{
- iconKey: 'security_hotspots',
+ iconKey: MetricKey.security_hotspots,
iconLabel: translate('projects.security_hotspots_reviewed'),
metricKey: isNewCode
? MetricKey.new_security_hotspots_reviewed
return measureList.map((measure) => {
const { iconLabel, metricKey, metricRatingKey, metricType } = measure;
- const measureValue =
- [
- MetricKey.security_issues,
- MetricKey.reliability_issues,
- MetricKey.maintainability_issues,
- ].includes(metricKey) && measures[metricKey]
- ? JSON.parse(measures[metricKey] as string)?.total
- : measures[metricKey];
-
return (
<ProjectCardMeasure key={metricKey} metricKey={metricKey} label={iconLabel}>
<RatingComponent ratingMetric={metricRatingKey} componentKey={componentKey} />
componentKey={componentKey}
metricKey={metricKey}
metricType={metricType}
- value={measureValue}
+ value={measures[metricKey]}
className="sw-ml-2 sw-typo-lg-semibold"
/>
</ProjectCardMeasure>
...PROJECT,
measures: {
...MEASURES,
- [MetricKey.security_issues]: JSON.stringify({ LOW: 0, MEDIUM: 0, HIGH: 1, total: 1 }),
- [MetricKey.reliability_issues]: JSON.stringify({ LOW: 0, MEDIUM: 2, HIGH: 0, total: 2 }),
- [MetricKey.maintainability_issues]: JSON.stringify({
- LOW: 3,
- MEDIUM: 0,
- HIGH: 0,
- total: 3,
- }),
+ [MetricKey.software_quality_security_issues]: '1',
+ [MetricKey.software_quality_reliability_issues]: '2',
+ [MetricKey.software_quality_maintainability_issues]: '3',
[MetricKey.software_quality_maintainability_rating]: '2',
[MetricKey.software_quality_reliability_rating]: '2',
[MetricKey.software_quality_security_rating]: '2',
...PROJECT,
measures: {
...MEASURES,
- [MetricKey.security_issues]: JSON.stringify({ LOW: 0, MEDIUM: 0, HIGH: 1, total: 1 }),
- [MetricKey.reliability_issues]: JSON.stringify({ LOW: 0, MEDIUM: 2, HIGH: 0, total: 2 }),
- [MetricKey.maintainability_issues]: JSON.stringify({
- LOW: 3,
- MEDIUM: 0,
- HIGH: 0,
- total: 3,
- }),
+ [MetricKey.software_quality_security_issues]: '1',
+ [MetricKey.software_quality_reliability_issues]: '2',
+ [MetricKey.software_quality_maintainability_issues]: '3',
[MetricKey.code_smells]: '4',
[MetricKey.bugs]: '5',
[MetricKey.vulnerabilities]: '6',
...PROJECT,
measures: {
...MEASURES,
- [MetricKey.security_issues]: JSON.stringify({ LOW: 0, MEDIUM: 0, HIGH: 1, total: 1 }),
- [MetricKey.reliability_issues]: JSON.stringify({ LOW: 0, MEDIUM: 2, HIGH: 0, total: 2 }),
- [MetricKey.maintainability_issues]: JSON.stringify({
- LOW: 3,
- MEDIUM: 0,
- HIGH: 0,
- total: 3,
- }),
+ [MetricKey.software_quality_security_issues]: '1',
+ [MetricKey.software_quality_reliability_issues]: '2',
+ [MetricKey.software_quality_maintainability_issues]: '3',
[MetricKey.software_quality_maintainability_rating]: '2',
[MetricKey.software_quality_reliability_rating]: '2',
[MetricKey.software_quality_security_rating]: '2',
describe('Overall measures', () => {
it('should be rendered properly', async () => {
renderProjectCardMeasures();
- expect(await screen.findByTitle('metric.security_issues.short_name')).toBeInTheDocument();
- expect(screen.getByTitle('metric.reliability_issues.short_name')).toBeInTheDocument();
- expect(screen.getByTitle('metric.maintainability_issues.short_name')).toBeInTheDocument();
+ expect(
+ await screen.findByTitle('metric.software_quality_security_issues.short_name'),
+ ).toBeInTheDocument();
+ expect(
+ screen.getByTitle('metric.software_quality_reliability_issues.short_name'),
+ ).toBeInTheDocument();
+ expect(
+ screen.getByTitle('metric.software_quality_maintainability_issues.short_name'),
+ ).toBeInTheDocument();
expect(screen.queryByTitle('metric.vulnerabilities.short_name')).not.toBeInTheDocument();
expect(screen.queryByTitle('metric.bugs.short_name')).not.toBeInTheDocument();
expect(screen.queryByTitle('metric.code_smells.short_name')).not.toBeInTheDocument();
expect(await screen.findByTitle('metric.vulnerabilities.short_name')).toBeInTheDocument();
expect(screen.getByTitle('metric.bugs.short_name')).toBeInTheDocument();
expect(screen.getByTitle('metric.code_smells.short_name')).toBeInTheDocument();
- expect(screen.queryByTitle('metric.security_issues.short_name')).not.toBeInTheDocument();
- expect(screen.queryByTitle('metric.reliability_issues.short_name')).not.toBeInTheDocument();
- expect(screen.queryByTitle('metric.maintainability_issues.short_name')).not.toBeInTheDocument();
+ expect(
+ screen.queryByTitle('metric.software_quality_security_issues.short_name'),
+ ).not.toBeInTheDocument();
+ expect(
+ screen.queryByTitle('metric.software_quality_software_quality_reliability_issues.short_name'),
+ ).not.toBeInTheDocument();
+ expect(
+ screen.queryByTitle('metric.software_quality_maintainability_issues.short_name'),
+ ).not.toBeInTheDocument();
});
it("should be not be rendered if there's no line of code", () => {
[MetricKey.code_smells]: '132',
[MetricKey.coverage]: '88.3',
[MetricKey.duplicated_lines_density]: '9.8',
- [MetricKey.maintainability_issues]: JSON.stringify({ total: 10 }),
- [MetricKey.reliability_issues]: JSON.stringify({ total: 10 }),
- [MetricKey.security_issues]: JSON.stringify({ total: 10 }),
+ [MetricKey.software_quality_maintainability_issues]: '10',
+ [MetricKey.software_quality_reliability_issues]: '10',
+ [MetricKey.software_quality_security_issues]: '10',
[MetricKey.ncloc]: '2053',
[MetricKey.reliability_rating]: '1.0',
[MetricKey.security_rating]: '1.0',
export const METRICS = [
MetricKey.alert_status,
- MetricKey.reliability_issues,
+ MetricKey.software_quality_reliability_issues,
MetricKey.bugs,
MetricKey.reliability_rating,
MetricKey.software_quality_reliability_rating,
- MetricKey.security_issues,
+ MetricKey.software_quality_security_issues,
MetricKey.vulnerabilities,
MetricKey.security_rating,
MetricKey.software_quality_security_rating,
- MetricKey.maintainability_issues,
+ MetricKey.software_quality_maintainability_issues,
MetricKey.code_smells,
MetricKey.sqale_rating,
MetricKey.software_quality_maintainability_rating,
const measure = componentMeasures.find(
(m) => m.metric === (areCCTMeasuresComputed ? metric : deprecatedMetric),
);
- const measureValue = areCCTMeasuresComputed
- ? JSON.parse(measure?.value ?? 'null').total
- : (measure?.value ?? 0);
+ const measureValue = measure?.value ?? 0;
const linkUrl = getComponentIssuesUrl(project, {
...getBranchLikeQuery(branchLike),
renderSourceViewer({ componentMeasures: generateMeasures(), showMeasures: true });
expect(
- await byLabelText('source_viewer.issue_link_x.3.metric.security_issues.short_name').find(),
+ await byLabelText(
+ 'source_viewer.issue_link_x.3.metric.software_quality_security_issues.short_name',
+ ).find(),
).toBeInTheDocument();
expect(
- await byLabelText('source_viewer.issue_link_x.3.metric.reliability_issues.short_name').find(),
+ await byLabelText(
+ 'source_viewer.issue_link_x.3.metric.software_quality_reliability_issues.short_name',
+ ).find(),
).toBeInTheDocument();
expect(
await byLabelText(
- 'source_viewer.issue_link_x.3.metric.maintainability_issues.short_name',
+ 'source_viewer.issue_link_x.3.metric.software_quality_maintainability_issues.short_name',
).find(),
).toBeInTheDocument();
});
});
expect(
- await byLabelText('source_viewer.issue_link_x.1.metric.security_issues.short_name').find(),
+ await byLabelText(
+ 'source_viewer.issue_link_x.1.metric.software_quality_security_issues.short_name',
+ ).find(),
).toBeInTheDocument();
expect(
- await byLabelText('source_viewer.issue_link_x.1.metric.reliability_issues.short_name').find(),
+ await byLabelText(
+ 'source_viewer.issue_link_x.1.metric.software_quality_reliability_issues.short_name',
+ ).find(),
).toBeInTheDocument();
expect(
await byLabelText(
- 'source_viewer.issue_link_x.1.metric.maintainability_issues.short_name',
+ 'source_viewer.issue_link_x.1.metric.software_quality_maintainability_issues.short_name',
).find(),
).toBeInTheDocument();
});
function generateMeasures(qualitiesValue = '3.0', overallValue = '1.0', newValue = '2.0') {
return [
...[
- MetricKey.security_issues,
- MetricKey.reliability_issues,
- MetricKey.maintainability_issues,
- ].map((metric) =>
- mockMeasure({ metric, value: JSON.stringify({ total: qualitiesValue }), period: undefined }),
- ),
+ MetricKey.software_quality_security_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_maintainability_issues,
+ ].map((metric) => mockMeasure({ metric, value: qualitiesValue, period: undefined })),
...[
MetricKey.ncloc,
MetricKey.new_lines,
});
it.each([
- ['MQR', 'true', MetricKey.maintainability_issues],
+ ['MQR', 'true', MetricKey.software_quality_maintainability_issues],
['Standard', 'false', MetricKey.code_smells],
])('should show the correct legend items in %s mode', async (_, mode, metric) => {
settingsHandler.set(SettingsKey.MQRMode, mode);
[
'MQR',
'true',
- MetricKey.reliability_issues,
- MetricKey.maintainability_issues,
- MetricKey.security_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_maintainability_issues,
+ MetricKey.software_quality_security_issues,
],
['Standard', 'false', MetricKey.bugs, MetricKey.code_smells, MetricKey.vulnerabilities],
])(
// Add/remove metrics.
addMetricBtn: byRole('button', { name: 'project_activity.graphs.custom.add' }),
- maintainabilityIssuesCheckbox: byRole('checkbox', { name: MetricKey.maintainability_issues }),
+ maintainabilityIssuesCheckbox: byRole('checkbox', {
+ name: MetricKey.software_quality_maintainability_issues,
+ }),
newBugsCheckbox: byRole('checkbox', { name: MetricKey.new_bugs }),
burnedBudgetCheckbox: byRole('checkbox', { name: MetricKey.burned_budget }),
hiddenOptionsAlert: byText('project_activity.graphs.custom.type_x_message', {
MetricKey.bugs,
MetricKey.code_smells,
MetricKey.vulnerabilities,
- MetricKey.maintainability_issues,
- MetricKey.reliability_issues,
- MetricKey.security_issues,
+ MetricKey.software_quality_maintainability_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_security_issues,
MetricKey.blocker_violations,
MetricKey.lines_to_cover,
MetricKey.uncovered_lines,
);
return {
data: measure.history.map((analysis) => {
- let { value } = analysis;
+ const { value } = analysis;
- if (value !== undefined && isSoftwareQualityMetric) {
- value = JSON.parse(value).total;
- }
return {
x: analysis.date,
y: metric?.type === MetricType.Level ? value : Number(value),
];
export const CCT_SOFTWARE_QUALITY_METRICS = [
- MetricKey.security_issues,
- MetricKey.reliability_issues,
- MetricKey.maintainability_issues,
+ MetricKey.software_quality_security_issues,
+ MetricKey.software_quality_reliability_issues,
+ MetricKey.software_quality_maintainability_issues,
];
export const LEAK_CCT_SOFTWARE_QUALITY_METRICS = [
- MetricKey.new_security_issues,
- MetricKey.new_reliability_issues,
- MetricKey.new_maintainability_issues,
+ MetricKey.new_software_quality_security_issues,
+ MetricKey.new_software_quality_reliability_issues,
+ MetricKey.new_software_quality_maintainability_issues,
];
export const OLD_TAXONOMY_METRICS = [
];
export const OLD_TO_NEW_TAXONOMY_METRICS_MAP: { [key in MetricKey]?: MetricKey } = {
- [MetricKey.vulnerabilities]: MetricKey.security_issues,
- [MetricKey.bugs]: MetricKey.reliability_issues,
- [MetricKey.code_smells]: MetricKey.maintainability_issues,
+ [MetricKey.vulnerabilities]: MetricKey.software_quality_security_issues,
+ [MetricKey.bugs]: MetricKey.software_quality_reliability_issues,
+ [MetricKey.code_smells]: MetricKey.software_quality_maintainability_issues,
+};
+
+export const SOFTWARE_QUALITIES_ISSUES_KEYS_MAP: Record<string, MetricKey> = {
+ [MetricKey.maintainability_issues]: MetricKey.software_quality_maintainability_issues,
+ [MetricKey.new_maintainability_issues]: MetricKey.new_software_quality_maintainability_issues,
+ [MetricKey.reliability_issues]: MetricKey.software_quality_reliability_issues,
+ [MetricKey.new_reliability_issues]: MetricKey.new_software_quality_reliability_issues,
+ [MetricKey.security_issues]: MetricKey.software_quality_security_issues,
+ [MetricKey.new_security_issues]: MetricKey.new_software_quality_security_issues,
};
export const RESOLUTIONS = [
export const SOFTWARE_QUALITIES_METRIC_KEYS_MAP = {
[SoftwareQuality.Security]: {
- metric: MetricKey.security_issues,
+ metric: MetricKey.software_quality_security_issues,
deprecatedMetric: MetricKey.vulnerabilities,
rating: MetricKey.security_rating,
newRating: MetricKey.new_security_rating,
},
[SoftwareQuality.Reliability]: {
- metric: MetricKey.reliability_issues,
+ metric: MetricKey.software_quality_reliability_issues,
deprecatedMetric: MetricKey.bugs,
rating: MetricKey.reliability_rating,
newRating: MetricKey.new_reliability_rating,
},
[SoftwareQuality.Maintainability]: {
- metric: MetricKey.maintainability_issues,
+ metric: MetricKey.software_quality_maintainability_issues,
deprecatedMetric: MetricKey.code_smells,
rating: MetricKey.sqale_rating,
newRating: MetricKey.new_maintainability_rating,
return metrics.filter(
(metric) =>
!metric.hidden &&
- ([...CCT_SOFTWARE_QUALITY_METRICS, ...LEAK_CCT_SOFTWARE_QUALITY_METRICS].includes(
- metric.key as MetricKey,
- ) ||
- ![MetricType.Data, MetricType.Distribution].includes(metric.type as MetricType)),
+ ![MetricType.Data, MetricType.Distribution].includes(metric.type as MetricType),
);
}
return (measure.metric as Metric)?.key !== undefined;
}
-export const getCCTMeasureValue = (key: string, value?: string) => {
- if (
- CCT_SOFTWARE_QUALITY_METRICS.concat(LEAK_CCT_SOFTWARE_QUALITY_METRICS).includes(
- key as MetricKey,
- ) &&
- value !== undefined
- ) {
- return JSON.parse(value).total;
- }
- return value;
-};
-
type RatingValue = 'A' | 'B' | 'C' | 'D' | 'E';
const RATING_VALUES: RatingValue[] = ['A', 'B', 'C', 'D', 'E'];
export function formatRating(value: string | number | undefined): RatingValue | undefined {
metric.new_software_quality_low_issues.description=New Low Severity issues
metric.new_software_quality_low_issues.name=New Low Severity Issues
metric.software_quality_maintainability_issues.name=Maintainability Issues
+metric.software_quality_maintainability_issues.short_name=Maintainability
metric.software_quality_maintainability_issues.description=Maintainability issues
metric.software_quality_reliability_issues.name=Reliability Issues
+metric.software_quality_reliability_issues.short_name=Reliability
metric.software_quality_reliability_issues.description=Reliability issues
metric.software_quality_security_issues.name=Security Issues
+metric.software_quality_security_issues.short_name=Security
metric.software_quality_security_issues.description=Security issues
metric.new_software_quality_maintainability_issues.name=New Maintainability Issues
metric.new_software_quality_maintainability_issues.description=New maintainability issues
component_measures.not_all_measures_are_shown.help=You do not have access to all projects and/or applications. Measures are still computed based on all projects and applications.
component_measures.metric.new_security_issues.name=Issues
+component_measures.metric.new_software_quality_security_issues.name=Issues
component_measures.metric.new_security_issues.detailed_name=New Issues
+component_measures.metric.new_software_quality_security_issues.detailed_name=New Issues
component_measures.metric.new_vulnerabilities.name=Vulnerabilities
component_measures.metric.new_vulnerabilities.detailed_name=New Vulnerabilities
component_measures.metric.new_reliability_issues.name=Issues
+component_measures.metric.new_software_quality_reliability_issues.name=Issues
component_measures.metric.new_reliability_issues.detailed_name=New Issues
+component_measures.metric.new_software_quality_reliability_issues.detailed_name=New Issues
component_measures.metric.new_maintainability_issues.name=Issues
+component_measures.metric.new_software_quality_maintainability_issues.name=Issues
component_measures.metric.new_maintainability_issues.detailed_name=New Issues
+component_measures.metric.new_software_quality_maintainability_issues.detailed_name=New Issues
component_measures.metric.new_code_smells.name=Code Smells
component_measures.metric.new_code_smells.detailed_name=New Code Smells
component_measures.metric.new_violations.name=Open Issues
component_measures.metric.new_bugs.name=Bugs
component_measures.metric.new_bugs.detailed_name=New Bugs
component_measures.metric.security_issues.name=Issues
+component_measures.metric.software_quality_security_issues.name=Issues
component_measures.metric.vulnerabilities.name=Vulnerabilities
component_measures.metric.reliability_issues.name=Issues
+component_measures.metric.software_quality_reliability_issues.name=Issues
component_measures.metric.bugs.name=Bugs
component_measures.metric.maintainability_issues.name=Issues
+component_measures.metric.software_quality_maintainability_issues.name=Issues
component_measures.metric.code_smells.name=Code Smells
component_measures.metric.violations.name=Open Issues
component_measures.metric.accepted_issues.name=Accepted Issues