Rename build/trigger to check/checker.
Change-Id: I2e1c536022c8f9ba62787b80931c91d165a76ef7
diff --git a/gr-checks/BUILD b/gr-checks/BUILD
index 9711ad1..e2dd6bd 100644
--- a/gr-checks/BUILD
+++ b/gr-checks/BUILD
@@ -8,9 +8,9 @@
load("//tools/bzl:js.bzl", "bundle_assets", "polygerrit_plugin")
polygerrit_plugin(
- name = "build_results",
- app = "build-results.html",
- plugin_name = "build_results",
+ name = "gr-checks",
+ app = "gr-checks.html",
+ plugin_name = "checks",
externs = ["externs.js"],
srcs = glob([
"*.html",
diff --git a/gr-checks/build-result-item.js b/gr-checks/build-result-item.js
deleted file mode 100644
index 5405359..0000000
--- a/gr-checks/build-result-item.js
+++ /dev/null
@@ -1,121 +0,0 @@
-(function() {
-'use strict';
-
-const Defs = {};
-/**
- * @typedef {{
- * id: string,
- * projectId: string,
- * buildTriggerId: string,
- * startTime: string,
- * finishTime: string,
- * }}
- */
-Defs.Build;
-
-Polymer({
- is: 'build-result-item',
-
- properties: {
- build: Object,
- /** @type {function(string): !Promise<!Object>} */
- getTrigger: Function,
- /** @type {function(string): !Promise<!Object>} */
- retryBuild: Function,
- _triggerDescription: String,
- _startTime: {
- type: String,
- computed: '_computeStartTime(build)',
- },
- _duration: {
- type: String,
- computed: '_computeDuration(build)',
- },
- },
-
- observers: [
- '_updateTriggerName(build, getTrigger)',
- ],
-
- /**
- * @param {!Defs.Build} build
- * @param {function(string): !Promise<!Object>} getTrigger
- */
- _updateTriggerName(build, getTrigger) {
- const triggerId = build.buildTriggerId;
- getTrigger(triggerId)
- .then(
- trigger => trigger && trigger.description || triggerId,
- () => triggerId)
- .then(triggerDescription => {
- this.set('_triggerDescription', triggerDescription);
- });
- },
-
- /**
- * @param {!Defs.Build} build
- * @return {string}
- */
- _computeStartTime(build) {
- return moment(build.startTime).format('l');
- },
-
- /**
- * @param {!Defs.Build} build
- * @return {string}
- */
- _computeDuration(build) {
- const startTime = moment(build.startTime);
- const finishTime = moment(build.finishTime);
- return generateDurationString(moment.duration(finishTime.diff(startTime)));
- },
-
- handleClick(event) {
- event.preventDefault();
- this.retryBuild(this.build.id);
- }
-});
-
-const ZERO_SECONDS = '0 sec';
-
-/**
- * @param {!Moment.Duration} duration a moment object
- * @return {string}
- */
-function generateDurationString(duration) {
- if (duration.asSeconds() === 0) {
- return ZERO_SECONDS;
- }
-
- const durationSegments = [];
- if (duration.seconds()) {
- durationSegments.push(`${duration.seconds()} sec`);
- }
- if (duration.minutes()) {
- durationSegments.push(`${duration.minutes()} min`);
- }
- if (duration.hours()) {
- const hours = pluralize(duration.hours(), 'hour', 'hours');
- durationSegments.push(`${duration.hours()} ${hours}`);
- }
- if (duration.days()) {
- const days = pluralize(duration.days(), 'day', 'days');
- durationSegments.push(`${duration.days()} ${days}`);
- }
- if (duration.months()) {
- const months = pluralize(duration.months(), 'month', 'months');
- durationSegments.push(`${duration.months()} ${months}`);
- }
- return durationSegments.join(' ');
-}
-
-/**
- * @param {number} unit
- * @param {string} singular
- * @param {string} plural
- * @return {string}
- */
-function pluralize(unit, singular, plural) {
- return unit === 1 ? singular : plural;
-}
-})();
diff --git a/gr-checks/build-result-item_test.html b/gr-checks/build-result-item_test.html
deleted file mode 100644
index cbf9309..0000000
--- a/gr-checks/build-result-item_test.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-<script src="imports.js"></script>
-<script src="webcomponentsjs/webcomponents-lite.js"></script>
-<link rel="import" href="polymer/polymer.html">
-
-<title>build-result-item</title>
-<link rel="import" href="webcomponent_lib/build-result-item.html">
-
-<test-fixture id="basic">
- <template is="dom-template">
- <build-result-item
- build="{{build}}"
- get-trigger="[[getTrigger]]"
- retry-build="[[retryBuild]]">
- </build-result-item>
- </template>
-</test-fixture>
-
-<script>
- suite('build-result-item tests', () => {
- let element;
- let sandbox;
- let getTriggerSpy;
- let resolveGetTrigger;
- let rejectGetTrigger;
- let retryBuildSpy;
-
- setup((done) => {
- sandbox = sinon.sandbox.create();
- const getTriggerPromise = new Promise((resolve, reject) => {
- resolveGetTrigger = resolve;
- rejectGetTrigger = reject;
- });
- getTriggerSpy = sinon.stub();
- getTriggerSpy.returns(getTriggerPromise);
- retryBuildSpy = sinon.stub();
- retryBuildSpy.returns(Promise.resolve());
-
- element = fixture('basic', {
- getTrigger: getTriggerSpy,
- retryBuild: retryBuildSpy,
- build: {
- buildTriggerId: 'test-build-trigger-id',
- logUrl: 'http://example.com/test-log-url',
- startTime: "2019-02-06T22:25:19.269Z",
- finishTime: "2019-02-06T22:25:44.574Z",
- },
- });
- flush(done);
- });
-
- teardown(() => { sandbox.restore(); });
-
- suite('trigger name', () => {
- test('calls getTrigger', () => {
- assert.isTrue(getTriggerSpy.called);
- assert.isTrue(getTriggerSpy.calledWith('test-build-trigger-id'));
- });
-
- function assertTriggerText(text) {
- const name = element.$$('td:nth-child(1)');
- assert.equal(name.textContent.trim(), text);
- }
-
- suite('on success', () => {
- setup(done => {
- resolveGetTrigger({description: 'test trigger name'});
- flush(done);
- });
-
- test('renders the trigger name on success', () => {
- assertTriggerText('test trigger name');
- });
- });
-
- suite('on empty response', () => {
- setup(done => {
- resolveGetTrigger();
- flush(done);
- });
-
- test('renders the id when there is no description', () => {
- assertTriggerText('test-build-trigger-id');
- });
- });
-
- suite('on error', () => {
- setup(done => {
- rejectGetTrigger(new Error('broken'));
- flush(done);
- });
-
- test('renders the id when the call fails', () => {
- assertTriggerText('test-build-trigger-id');
- });
- });
- });
-
- test('renders the status', () => {
- const status = element.$$('td:nth-child(3) > build-result-status');
- assert.exists(status);
- });
-
- test('renders the checking system', () => {
- const checkingSystem = element.$$('td:nth-child(4)');
- assert.equal(checkingSystem .textContent.trim(), "Google Cloud Build");
- });
-
- test('renders the run date', () => {
- const name = element.$$('td:nth-child(5)');
- assert.equal(name .textContent.trim(), "2/6/2019");
- });
-
- suite('duration', () => {
- test('renders the run duration', () => {
- const name = element.$$('td:nth-child(6)');
- assert.equal(name .textContent.trim(), "25 sec");
- });
-
- test('renders 0 sec when the start and end time are the same', () => {
- element.build = {
- buildTriggerId: 'test-build-trigger-id',
- logUrl: 'http://example.com/test-log-url',
- startTime: "2019-02-06T22:25:19.269Z",
- finishTime: "2019-02-06T22:25:19.269Z",
- };
- const name = element.$$('td:nth-child(6)');
- assert.equal(name .textContent.trim(), "0 sec");
- });
- });
-
- test('renders a link to the log', () => {
- const logLink = element.$$('td:nth-child(7) > a');
- assert.equal(logLink.getAttribute('href'), "http://example.com/test-log-url");
- assert.equal(logLink.textContent.trim(), "View log");
- });
-
- suite('retryBuild', () => {
- let retryBuildLink;
-
- setup(() => {
- retryBuildLink = element.$$('td:nth-child(7) > gr-button');
- });
-
- test('shows a link to the log url', () => {
- assert.equal(retryBuildLink.textContent.trim(), "Re-run");
- });
-
- test('clicking on the link calls the retryBuild property', () => {
- assert.isFalse(retryBuildSpy.called);
- retryBuildLink.click();
- assert.isTrue(retryBuildSpy.called);
- });
- });
- });
-</script>
diff --git a/gr-checks/build-result-status.js b/gr-checks/build-result-status.js
deleted file mode 100644
index f7f94fd..0000000
--- a/gr-checks/build-result-status.js
+++ /dev/null
@@ -1,37 +0,0 @@
-(function() {
-'use strict';
-
-Polymer({
- is: 'build-result-status',
-
- properties: {
- showText: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
- status: String,
- _className: {type: String, computed: '_computeClassName(status)'},
- },
-
- _isUnevaluated(status) {
- return window.Gerrit.BuildResults.isUnevaluated(status);
- },
-
- _isInProgress(status) {
- return window.Gerrit.BuildResults.isInProgress(status);
- },
-
- _isSuccessful(status) {
- return window.Gerrit.BuildResults.isSuccessful(status);
- },
-
- _isFailed(status) {
- return window.Gerrit.BuildResults.isFailed(status);
- },
-
- _computeClassName(status) {
- return window.Gerrit.BuildResults.statusClass(status);
- },
-});
-})();
diff --git a/gr-checks/build-results.html b/gr-checks/build-results.html
deleted file mode 100644
index c47ec37..0000000
--- a/gr-checks/build-results.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<link rel="import" href="build-results-view.html">
-<link rel="import" href="build-result-item.html">
-<link rel="import" href="build-result-status.html">
-<link rel="import" href="builds-chip-view.html">
-<link rel="import" href="builds-results-change-list-item-cell-view.html">
-<link rel="import" href="builds-results-change-list-header-view.html">
-<link rel="import" href="builds-results-change-view-tab-header-view.html">
-<link rel="import" href="build-results-configure-link.html">
-
-<dom-module id="build-results">
- <script>
- Gerrit.install(plugin => {
- plugin.registerDynamicCustomComponent(
- 'change-list-header',
- 'builds-results-change-list-header-view');
- plugin.registerDynamicCustomComponent(
- 'change-list-item-cell',
- 'builds-results-change-list-item-cell-view');
- plugin.registerDynamicCustomComponent(
- 'change-view-tab-header',
- 'builds-results-change-view-tab-header-view');
- plugin.registerDynamicCustomComponent(
- 'change-view-tab-content',
- 'build-results-view').onAttached(
- buildResultsView => console.log('build-results-view attached'));
- });
- </script>
-</dom-module>
diff --git a/gr-checks/builds-chip-view.js b/gr-checks/builds-chip-view.js
deleted file mode 100644
index 2fff5bf..0000000
--- a/gr-checks/builds-chip-view.js
+++ /dev/null
@@ -1,124 +0,0 @@
-(function() {
-'use strict';
-const Statuses = window.Gerrit.BuildResults.Statuses;
-
-const StatusPriorityOrder = [
- Statuses.INTERNAL_ERROR, Statuses.TIMEOUT, Statuses.FAILURE,
- Statuses.STATUS_UNKNOWN, Statuses.CANCELLED, Statuses.QUEUED,
- Statuses.QUEUING, Statuses.WORKING, Statuses.SUCCESS
-];
-
-const HumanizedStatuses = {
- // non-terminal statuses
- STATUS_UNKNOWN: 'unevaluated',
- QUEUING: 'in progress',
- QUEUED: 'in progress',
- WORKING: 'in progress',
-
- // terminal statuses
- SUCCESS: 'successful',
- FAILURE: 'failed',
- INTERNAL_ERROR: 'failed',
- TIMEOUT: 'failed',
- CANCELLED: 'unevaluated',
-};
-
-
-const Defs = {};
-/**
- * @typedef {{
- * revisions: !Object<string, !Object>,
- * }}
- */
-Defs.Change;
-
-/**
- * @param {!Defs.Change} change The current CL.
- * @param {!Object} revision The current patchset.
- * @return {string|undefined}
- */
-function currentRevisionSha(change, revision) {
- return Object.keys(change.revisions)
- .find(sha => change.revisions[sha] === revision);
-}
-
-function computeBuildResultStatuses(buildResults) {
- return buildResults.reduce((accum, buildResult) => {
- accum[buildResult.status] || (accum[buildResult.status] = 0);
- accum[buildResult.status]++;
- return accum;
- }, {total: buildResults.length});
-}
-
-Polymer({
- is: 'builds-chip-view',
-
- properties: {
- revision: Object,
- change: Object,
- // TODO(brohlfs): Implement getBuildResults based on new Rest APIs.
- /** @type {function(string, (string|undefined)): !Promise<!Object>} */
- getBuildResults: Function,
- _buildResultStatuses: Object,
- _hasBuilds: Boolean,
- _status: {type: String, computed: '_computeStatus(_buildResultStatuses)'},
- _statusString: {
- type: String,
- computed: '_computeStatusString(_status, _buildResultStatuses)'
- },
- _chipClasses: {type: String, computed: '_computeChipClass(_status)'},
- },
-
- observers: [
- '_fetchBuildResults(change, revision, getBuildResults)',
- ],
-
- /**
- * @param {!Defs.Change} change The current CL.
- * @param {!Object} revision The current patchset.
- * @param {function(string, (string|undefined)): !Promise<!Object>}
- * getBuildResults function to get build results.
- */
- _fetchBuildResults(change, revision, getBuildResults) {
- const repository = change['project'];
- const gitSha = currentRevisionSha(change, revision);
-
- getBuildResults(repository, gitSha).then(buildResults => {
- this.set('_hasBuilds', buildResults.length > 0);
- if (buildResults.length > 0) {
- this.set(
- '_buildResultStatuses', computeBuildResultStatuses(buildResults));
- }
- });
- },
-
- /**
- * @param {!Object} buildResultStatuses The number of builds in each status.
- * @return {string}
- */
- _computeStatus(buildResultStatuses) {
- return StatusPriorityOrder.find(
- status => buildResultStatuses[status] > 0) ||
- Statuses.STATUS_UNKNOWN;
- },
-
- /**
- * @param {string} status The overall status of the build results.
- * @param {!Object} buildResultStatuses The number of builds in each status.
- * @return {string}
- */
- _computeStatusString(status, buildResultStatuses) {
- if (buildResultStatuses.total === 0) return 'No builds';
- return `${buildResultStatuses[status]} of ${
- buildResultStatuses.total} builds ${HumanizedStatuses[status]}`;
- },
-
- /**
- * @param {string} status The overall status of the build results.
- * @return {string}
- */
- _computeChipClass(status) {
- return `chip ${window.Gerrit.BuildResults.statusClass(status)}`;
- },
-});
-})();
diff --git a/gr-checks/builds-results-change-list-header-view.html b/gr-checks/builds-results-change-list-header-view.html
deleted file mode 100644
index 596adfe..0000000
--- a/gr-checks/builds-results-change-list-header-view.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<dom-module id="builds-results-change-list-header-view">
- <style>
- :host {
- display: table-cell;
- padding: 0 3px;
- }
- </style>
- <template>
- Checks
- </template>
-
- <script src="builds-results-change-list-header-view.js"></script>
-</dom-module>
diff --git a/gr-checks/builds-results-change-list-header-view.js b/gr-checks/builds-results-change-list-header-view.js
deleted file mode 100644
index 19aad70..0000000
--- a/gr-checks/builds-results-change-list-header-view.js
+++ /dev/null
@@ -1,7 +0,0 @@
-(function() {
-'use strict';
-
-Polymer({
- is: 'builds-results-change-list-header-view',
-});
-})();
diff --git a/gr-checks/builds-results-change-list-item-cell-view.html b/gr-checks/builds-results-change-list-item-cell-view.html
deleted file mode 100644
index a919c3d..0000000
--- a/gr-checks/builds-results-change-list-item-cell-view.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<dom-module id="builds-results-change-list-item-cell-view">
- <style>
- :host {
- display: inline-block;
- text-align: center;
- width: 100%;
- }
- </style>
- <template>
- </template>
-
- <script src="builds-results-change-list-item-cell-view.js"></script>
-</dom-module>
diff --git a/gr-checks/builds-results-change-view-tab-header-view.html b/gr-checks/builds-results-change-view-tab-header-view.html
deleted file mode 100644
index 2982f70..0000000
--- a/gr-checks/builds-results-change-view-tab-header-view.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<dom-module id="builds-results-change-view-tab-header-view">
- <template>
- Checks
- </template>
-
- <script src="builds-results-change-view-tab-header-view.js"></script>
-</dom-module>
diff --git a/gr-checks/builds-results-change-view-tab-header-view.js b/gr-checks/builds-results-change-view-tab-header-view.js
deleted file mode 100644
index 27ccf83..0000000
--- a/gr-checks/builds-results-change-view-tab-header-view.js
+++ /dev/null
@@ -1,7 +0,0 @@
-(function() {
-'use strict';
-
-Polymer({
- is: 'builds-results-change-view-tab-header-view',
-});
-})();
diff --git a/gr-checks/builds-results-change-view-tab-header-view_test.html b/gr-checks/builds-results-change-view-tab-header-view_test.html
deleted file mode 100644
index b71371b..0000000
--- a/gr-checks/builds-results-change-view-tab-header-view_test.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-<script src="imports.js"></script>
-<script src="webcomponentsjs/webcomponents-lite.js"></script>
-<link rel="import" href="polymer/polymer.html">
-
-<title>builds-results-change-view-tab-header-view</title>
-<link rel="import" href="webcomponent_lib/builds-results-change-view-tab-header-view.html">
-
-<test-fixture id="basic">
- <template is="dom-template">
- <builds-results-change-view-tab-header-view></builds-results-change-view-tab-header-view>
- </template>
-</test-fixture>
-
-<script>
- suite('builds-results-change-view-tab-header-view tests', () => {
- let element;
- let sandbox;
-
- setup((done) => {
- sandbox = sinon.sandbox.create();
-
-
- element = fixture('basic');
- flush(done);
- });
-
- teardown(() => { sandbox.restore(); });
-
- test('renders the header', () => {
- assert.include(element.textContent.trim(), 'Checks');
- });
- });
-</script>
diff --git a/gr-checks/all-statuses.js b/gr-checks/gr-checks-all-statuses.js
similarity index 74%
rename from gr-checks/all-statuses.js
rename to gr-checks/gr-checks-all-statuses.js
index d318830..9f76441 100644
--- a/gr-checks/all-statuses.js
+++ b/gr-checks/gr-checks-all-statuses.js
@@ -2,10 +2,10 @@
'use strict';
window.Gerrit = (window.Gerrit || {});
-window.Gerrit.BuildResults = (window.Gerrit.BuildResults || {});
+window.Gerrit.Checks = (window.Gerrit.Checks || {});
// Prevent redefinition.
-if (window.Gerrit.BuildResults.Statuses) return;
+if (window.Gerrit.Checks.Statuses) return;
const Statuses = {
// non-terminal statuses
@@ -63,10 +63,10 @@
return 'unevaluated';
}
-window.Gerrit.BuildResults.Statuses = Statuses;
-window.Gerrit.BuildResults.isUnevaluated = isUnevaluated;
-window.Gerrit.BuildResults.isInProgress = isInProgress;
-window.Gerrit.BuildResults.isSuccessful = isSuccessful;
-window.Gerrit.BuildResults.isFailed = isFailed;
-window.Gerrit.BuildResults.statusClass = statusClass;
+window.Gerrit.Checks.Statuses = Statuses;
+window.Gerrit.Checks.isUnevaluated = isUnevaluated;
+window.Gerrit.Checks.isInProgress = isInProgress;
+window.Gerrit.Checks.isSuccessful = isSuccessful;
+window.Gerrit.Checks.isFailed = isFailed;
+window.Gerrit.Checks.statusClass = statusClass;
})();
diff --git a/gr-checks/gr-checks-change-list-header-view.html b/gr-checks/gr-checks-change-list-header-view.html
new file mode 100644
index 0000000..9ddc13a
--- /dev/null
+++ b/gr-checks/gr-checks-change-list-header-view.html
@@ -0,0 +1,13 @@
+<dom-module id="gr-checks-change-list-header-view">
+ <style>
+ :host {
+ display: table-cell;
+ padding: 0 3px;
+ }
+ </style>
+ <template>
+ Checks
+ </template>
+
+ <script src="gr-checks-change-list-header-view.js"></script>
+</dom-module>
diff --git a/gr-checks/gr-checks-change-list-header-view.js b/gr-checks/gr-checks-change-list-header-view.js
new file mode 100644
index 0000000..7a6a773
--- /dev/null
+++ b/gr-checks/gr-checks-change-list-header-view.js
@@ -0,0 +1,7 @@
+(function() {
+'use strict';
+
+Polymer({
+ is: 'gr-checks-change-list-header-view',
+});
+})();
diff --git a/gr-checks/builds-results-change-list-header-view_test.html b/gr-checks/gr-checks-change-list-header-view_test.html
similarity index 70%
rename from gr-checks/builds-results-change-list-header-view_test.html
rename to gr-checks/gr-checks-change-list-header-view_test.html
index b380930..d9113f5 100644
--- a/gr-checks/builds-results-change-list-header-view_test.html
+++ b/gr-checks/gr-checks-change-list-header-view_test.html
@@ -4,18 +4,18 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>builds-results-change-list-header-view</title>
-<link rel="import" href="webcomponent_lib/builds-results-change-list-header-view.html">
+<title>gr-checks-change-list-header-view</title>
+<link rel="import" href="webcomponent_lib/gr-checks-change-list-header-view.html">
<test-fixture id="basic">
<template is="dom-template">
- <builds-results-change-list-header-view></builds-results-change-list-header-view>
+ <gr-checks-change-list-header-view></gr-checks-change-list-header-view>
</template>
</test-fixture>
<script>
- suite('builds-results-change-list-header-view tests', () => {
+ suite('gr-checks-change-list-header-view tests', () => {
let element;
let sandbox;
diff --git a/gr-checks/gr-checks-change-list-item-cell-view.html b/gr-checks/gr-checks-change-list-item-cell-view.html
new file mode 100644
index 0000000..61af378
--- /dev/null
+++ b/gr-checks/gr-checks-change-list-item-cell-view.html
@@ -0,0 +1,13 @@
+<dom-module id="gr-checks-change-list-item-cell-view">
+ <style>
+ :host {
+ display: inline-block;
+ text-align: center;
+ width: 100%;
+ }
+ </style>
+ <template>
+ </template>
+
+ <script src="gr-checks-change-list-item-cell-view.js"></script>
+</dom-module>
diff --git a/gr-checks/builds-results-change-list-item-cell-view.js b/gr-checks/gr-checks-change-list-item-cell-view.js
similarity index 64%
rename from gr-checks/builds-results-change-list-item-cell-view.js
rename to gr-checks/gr-checks-change-list-item-cell-view.js
index ff8b556..4d45a44 100644
--- a/gr-checks/builds-results-change-list-item-cell-view.js
+++ b/gr-checks/gr-checks-change-list-item-cell-view.js
@@ -2,7 +2,7 @@
'use strict';
Polymer({
- is: 'builds-results-change-list-item-cell-view',
+ is: 'gr-checks-change-list-item-cell-view',
properties: {
change: Object,
diff --git a/gr-checks/builds-results-change-list-item-cell-view_test.html b/gr-checks/gr-checks-change-list-item-cell-view_test.html
similarity index 72%
rename from gr-checks/builds-results-change-list-item-cell-view_test.html
rename to gr-checks/gr-checks-change-list-item-cell-view_test.html
index f1047fe..c50f7e6 100644
--- a/gr-checks/builds-results-change-list-item-cell-view_test.html
+++ b/gr-checks/gr-checks-change-list-item-cell-view_test.html
@@ -4,18 +4,18 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>builds-results-change-list-item-cell-view</title>
-<link rel="import" href="webcomponent_lib/builds-results-change-list-item-cell-view.html">
+<title>gr-checks-change-list-item-cell-view</title>
+<link rel="import" href="webcomponent_lib/gr-checks-change-list-item-cell-view.html">
<test-fixture id="basic">
<template is="dom-template">
- <builds-results-change-list-item-cell-view change="[[change]]"></builds-results-change-list-item-cell-view>
+ <gr-checks-change-list-item-cell-view change="[[change]]"></gr-checks-change-list-item-cell-view>
</template>
</test-fixture>
<script>
- suite('builds-results-change-list-item-cell-view tests', () => {
+ suite('gr-checks-change-list-item-cell-view tests', () => {
let element;
let sandbox;
diff --git a/gr-checks/gr-checks-change-view-tab-header-view.html b/gr-checks/gr-checks-change-view-tab-header-view.html
new file mode 100644
index 0000000..e5d6dc1
--- /dev/null
+++ b/gr-checks/gr-checks-change-view-tab-header-view.html
@@ -0,0 +1,7 @@
+<dom-module id="gr-checks-change-view-tab-header-view">
+ <template>
+ Checks
+ </template>
+
+ <script src="gr-checks-change-view-tab-header-view.js"></script>
+</dom-module>
diff --git a/gr-checks/gr-checks-change-view-tab-header-view.js b/gr-checks/gr-checks-change-view-tab-header-view.js
new file mode 100644
index 0000000..b18ce2f
--- /dev/null
+++ b/gr-checks/gr-checks-change-view-tab-header-view.js
@@ -0,0 +1,7 @@
+(function() {
+'use strict';
+
+Polymer({
+ is: 'gr-checks-change-view-tab-header-view',
+});
+})();
diff --git a/gr-checks/builds-results-change-list-header-view_test.html b/gr-checks/gr-checks-change-view-tab-header-view_test.html
similarity index 70%
copy from gr-checks/builds-results-change-list-header-view_test.html
copy to gr-checks/gr-checks-change-view-tab-header-view_test.html
index b380930..9915502 100644
--- a/gr-checks/builds-results-change-list-header-view_test.html
+++ b/gr-checks/gr-checks-change-view-tab-header-view_test.html
@@ -4,18 +4,17 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>builds-results-change-list-header-view</title>
-<link rel="import" href="webcomponent_lib/builds-results-change-list-header-view.html">
+<title>gr-checks-change-view-tab-header-view</title>
+<link rel="import" href="webcomponent_lib/gr-checks-change-view-tab-header-view.html">
<test-fixture id="basic">
<template is="dom-template">
- <builds-results-change-list-header-view></builds-results-change-list-header-view>
+ <gr-checks-change-view-tab-header-view></gr-checks-change-view-tab-header-view>
</template>
</test-fixture>
<script>
-
- suite('builds-results-change-list-header-view tests', () => {
+ suite('gr-checks-change-view-tab-header-view tests', () => {
let element;
let sandbox;
diff --git a/gr-checks/builds-chip-view.html b/gr-checks/gr-checks-chip-view.html
similarity index 64%
rename from gr-checks/builds-chip-view.html
rename to gr-checks/gr-checks-chip-view.html
index 110d26b..2bda0de 100644
--- a/gr-checks/builds-chip-view.html
+++ b/gr-checks/gr-checks-chip-view.html
@@ -1,4 +1,4 @@
-<dom-module id="builds-chip-view">
+<dom-module id="gr-checks-chip-view">
<template>
<style>
@@ -17,15 +17,15 @@
border-color: #DA4236;
}
</style>
- <template is="dom-if" if="[[_hasBuilds]]">
+ <template is="dom-if" if="[[_hasChecks]]">
Checks:
<span class$="[[_chipClasses]]">
- <build-result-status status="[[_status]]"></build-result-status>
+ <gr-checks-status status="[[_status]]"></gr-checks-status>
[[_statusString]]
</span>
</template>
</template>
- <script src="all-statuses.js"></script>
- <script src="builds-chip-view.js"></script>
+ <script src="gr-checks-all-statuses.js"></script>
+ <script src="gr-checks-chip-view.js"></script>
</dom-module>
diff --git a/gr-checks/gr-checks-chip-view.js b/gr-checks/gr-checks-chip-view.js
new file mode 100644
index 0000000..415bc1f
--- /dev/null
+++ b/gr-checks/gr-checks-chip-view.js
@@ -0,0 +1,124 @@
+(function() {
+'use strict';
+const Statuses = window.Gerrit.Checks.Statuses;
+
+const StatusPriorityOrder = [
+ Statuses.INTERNAL_ERROR, Statuses.TIMEOUT, Statuses.FAILURE,
+ Statuses.STATUS_UNKNOWN, Statuses.CANCELLED, Statuses.QUEUED,
+ Statuses.QUEUING, Statuses.WORKING, Statuses.SUCCESS
+];
+
+const HumanizedStatuses = {
+ // non-terminal statuses
+ STATUS_UNKNOWN: 'unevaluated',
+ QUEUING: 'in progress',
+ QUEUED: 'in progress',
+ WORKING: 'in progress',
+
+ // terminal statuses
+ SUCCESS: 'successful',
+ FAILURE: 'failed',
+ INTERNAL_ERROR: 'failed',
+ TIMEOUT: 'failed',
+ CANCELLED: 'unevaluated',
+};
+
+
+const Defs = {};
+/**
+ * @typedef {{
+ * revisions: !Object<string, !Object>,
+ * }}
+ */
+Defs.Change;
+
+/**
+ * @param {!Defs.Change} change The current CL.
+ * @param {!Object} revision The current patchset.
+ * @return {string|undefined}
+ */
+function currentRevisionSha(change, revision) {
+ return Object.keys(change.revisions)
+ .find(sha => change.revisions[sha] === revision);
+}
+
+function computeCheckStatuses(checks) {
+ return checks.reduce((accum, check) => {
+ accum[check.state] || (accum[check.state] = 0);
+ accum[check.state]++;
+ return accum;
+ }, {total: checks.length});
+}
+
+Polymer({
+ is: 'gr-checks-chip-view',
+
+ properties: {
+ revision: Object,
+ change: Object,
+ // TODO(brohlfs): Implement getChecks based on new Rest APIs.
+ /** @type {function(string, (string|undefined)): !Promise<!Object>} */
+ getChecks: Function,
+ _checkStatuses: Object,
+ _hasChecks: Boolean,
+ _status: {type: String, computed: '_computeStatus(_checkStatuses)'},
+ _statusString: {
+ type: String,
+ computed: '_computeStatusString(_status, _checkStatuses)'
+ },
+ _chipClasses: {type: String, computed: '_computeChipClass(_status)'},
+ },
+
+ observers: [
+ '_fetchChecks(change, revision, getChecks)',
+ ],
+
+ /**
+ * @param {!Defs.Change} change The current CL.
+ * @param {!Object} revision The current patchset.
+ * @param {function(string, (string|undefined)): !Promise<!Object>}
+ * getChecks function to get checks.
+ */
+ _fetchChecks(change, revision, getChecks) {
+ const repository = change['project'];
+ const gitSha = currentRevisionSha(change, revision);
+
+ getChecks(repository, gitSha).then(checks => {
+ this.set('_hasChecks', checks.length > 0);
+ if (checks.length > 0) {
+ this.set(
+ '_checkStatuses', computeCheckStatuses(checks));
+ }
+ });
+ },
+
+ /**
+ * @param {!Object} checkStatuses The number of checks in each status.
+ * @return {string}
+ */
+ _computeStatus(checkStatuses) {
+ return StatusPriorityOrder.find(
+ status => checkStatuses[status] > 0) ||
+ Statuses.STATUS_UNKNOWN;
+ },
+
+ /**
+ * @param {string} status The overall status of the checks.
+ * @param {!Object} checkStatuses The number of checks in each status.
+ * @return {string}
+ */
+ _computeStatusString(status, checkStatuses) {
+ if (checkStatuses.total === 0) return 'No checks';
+ return `${checkStatuses[status]} of ${
+ checkStatuses.total} checks ${HumanizedStatuses[status]}`;
+ },
+
+ /**
+ * @param {string} status The overall status of the checks.
+ * @return {string}
+ */
+ _computeChipClass(status) {
+ return `chip ${window.Gerrit.Checks.statusClass(status)}`;
+ },
+});
+})();
diff --git a/gr-checks/builds-chip-view_test.html b/gr-checks/gr-checks-chip-view_test.html
similarity index 61%
rename from gr-checks/builds-chip-view_test.html
rename to gr-checks/gr-checks-chip-view_test.html
index 2f0feb5..fb1c67a 100644
--- a/gr-checks/builds-chip-view_test.html
+++ b/gr-checks/gr-checks-chip-view_test.html
@@ -4,45 +4,45 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>builds-chip-view</title>
-<link rel="import" href="webcomponent_lib/builds-chip-view.html">
+<title>gr-checks-chip-view</title>
+<link rel="import" href="webcomponent_lib/gr-checks-chip-view.html">
<test-fixture id="basic">
<template is="dom-template">
- <builds-chip-view change="[[change]]" revision="[[revision]]" get-build-results="[[getBuildResults]]"></builds-chip-view>
+ <gr-checks-chip-view change="[[change]]" revision="[[revision]]" get-gr-checks="[[getChecks]]"></gr-checks-chip-view>
</template>
</test-fixture>
<script>
- const BUILD1 = {
- buildTriggerId: 'test-build-trigger-id',
+ const CHECK1 = {
+ checkId: 'test-check-id',
logUrl: 'http://example.com/test-log-url',
startTime: "2019-02-06T22:25:19.269Z",
finishTime: "2019-02-06T22:25:44.574Z",
status: 'SUCCESS',
};
- const BUILD2 = {
- buildTriggerId: 'test-build-trigger-id-2',
+ const CHECK2 = {
+ checkId: 'test-check-id-2',
logUrl: 'http://example.com/test-log-url',
startTime: "2019-02-06T22:25:19.269Z",
finishTime: "2019-02-06T22:25:44.574Z",
status: 'FAILURE',
};
- suite('build-chip-view tests', () => {
+ suite('gr-checks-chip-view tests', () => {
let element;
let sandbox;
- let getBuildResultsSpy;
+ let getChecksSpy;
setup((done) => {
sandbox = sinon.sandbox.create();
- getBuildResultsSpy = sinon.stub();
- getBuildResultsSpy.returns(Promise.resolve([BUILD1, BUILD2, BUILD1]));
+ getChecksSpy = sinon.stub();
+ getChecksSpy.returns(Promise.resolve([CHECK1, CHECK2, CHECK1]));
element = fixture('basic', {
- getBuildResults: getBuildResultsSpy,
+ getChecks: getChecksSpy,
change: {
'project': 'test-repository',
'revisions': {
@@ -62,14 +62,14 @@
});
suite('builds chip contents', () => {
- test('queries the builds', () => {
- assert.isTrue(getBuildResultsSpy.called);
- assert.isTrue(getBuildResultsSpy.calledWith('test-repository', 'second-sha'));
+ test('queries the checks', () => {
+ assert.isTrue(getChecksSpy.called);
+ assert.isTrue(getChecksSpy.calledWith('test-repository', 'second-sha'));
});
- test('renders the text of failed builds', () => {
+ test('renders the text of failed checks', () => {
const chip = element.$$('.chip');
- assert.equal(chip.textContent.trim(), '1 of 3 builds failed');
+ assert.equal(chip.textContent.trim(), '1 of 3 checks failed');
});
});
});
diff --git a/gr-checks/build-results-configure-link.html b/gr-checks/gr-checks-configure-link.html
similarity index 76%
rename from gr-checks/build-results-configure-link.html
rename to gr-checks/gr-checks-configure-link.html
index 8a83e3e..23cbb6e 100644
--- a/gr-checks/build-results-configure-link.html
+++ b/gr-checks/gr-checks-configure-link.html
@@ -1,4 +1,4 @@
-<dom-module id="build-results-configure-link">
+<dom-module id="gr-checks-configure-link">
<template>
<style>
iron-icon {
@@ -14,5 +14,5 @@
</gr-button>
</a>
</template>
- <script src="build-results-configure-link.js"></script>
+ <script src="gr-checks-configure-link.js"></script>
</dom-module>
diff --git a/gr-checks/build-results-configure-link.js b/gr-checks/gr-checks-configure-link.js
similarity index 72%
rename from gr-checks/build-results-configure-link.js
rename to gr-checks/gr-checks-configure-link.js
index c17b329..0eb1571 100644
--- a/gr-checks/build-results-configure-link.js
+++ b/gr-checks/gr-checks-configure-link.js
@@ -2,7 +2,7 @@
'use strict';
Polymer({
- is: 'build-results-configure-link',
+ is: 'gr-checks-configure-link',
properties: {
configurePath: String,
diff --git a/gr-checks/build-results-configure-link_test.html b/gr-checks/gr-checks-configure-link_test.html
similarity index 72%
rename from gr-checks/build-results-configure-link_test.html
rename to gr-checks/gr-checks-configure-link_test.html
index 179ada2..3c8f314 100644
--- a/gr-checks/build-results-configure-link_test.html
+++ b/gr-checks/gr-checks-configure-link_test.html
@@ -4,17 +4,17 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>build-results-configure-link</title>
-<link rel="import" href="webcomponent_lib/build-results-configure-link.html">
+<title>gr-checks-configure-link</title>
+<link rel="import" href="webcomponent_lib/gr-checks-configure-link.html">
<test-fixture id="basic">
<template is="dom-template">
- <build-results-configure-link configure-path="[[configurePath]]"></build-results-configure-link>
+ <gr-checks-configure-link configure-path="[[configurePath]]"></gr-checks-configure-link>
</template>
</test-fixture>
<script>
- suite('build-results-configure-link tests', () => {
+ suite('gr-checks-configure-link tests', () => {
let element;
let sandbox;
@@ -28,7 +28,7 @@
teardown(() => { sandbox.restore(); });
- test('renders the link to configure a build', () => {
+ test('renders the link to configure a check', () => {
const configureLink = element.$$('a');
assert.equal(configureLink.getAttribute('href'), 'http://example.com/test-configure');
assert.equal(configureLink.textContent.trim(), 'Configure checks');
diff --git a/gr-checks/build-result-item.html b/gr-checks/gr-checks-item.html
similarity index 70%
rename from gr-checks/build-result-item.html
rename to gr-checks/gr-checks-item.html
index c134205..436f65b 100644
--- a/gr-checks/build-result-item.html
+++ b/gr-checks/gr-checks-item.html
@@ -1,4 +1,4 @@
-<dom-module id="build-result-item">
+<dom-module id="gr-checks-item">
<template>
<style>
:host {
@@ -20,16 +20,16 @@
}
</style>
- <td>[[_triggerDescription]]</td>
+ <td>[[_checkerDescription]]</td>
<td><!-- required for merge--></td>
<td>
- <build-result-status show-text status="[[build.status]]"></build-result-status>
+ <gr-checks-status show-text status="[[check.state]]"></gr-checks-status>
</td>
- <td>Google Cloud Build</td>
+ <td>Check System</td>
<td>[[_startTime]]</td>
<td>[[_duration]]</td>
<td>
- <a href$="[[build.logUrl]]" target="_blank" class="log">
+ <a href$="[[check.url]]" target="_blank" class="log">
<gr-button link no-uppercase>
View log
</gr-button>
@@ -42,5 +42,5 @@
</gr-button>
</td>
</template>
- <script src="build-result-item.js"></script>
+ <script src="gr-checks-item.js"></script>
</dom-module>
diff --git a/gr-checks/gr-checks-item.js b/gr-checks/gr-checks-item.js
new file mode 100644
index 0000000..272f82c
--- /dev/null
+++ b/gr-checks/gr-checks-item.js
@@ -0,0 +1,120 @@
+(function() {
+ 'use strict';
+
+ const Defs = {};
+ /**
+ * @typedef {{
+ * id: string,
+ * projectId: string,
+ * checkerId: string,
+ * startTime: string,
+ * finishTime: string,
+ * }}
+ */
+ Defs.Check;
+
+ Polymer({
+ is: 'gr-checks-item',
+
+ properties: {
+ check: Object,
+ /** @type {function(string): !Promise<!Object>} */
+ getChecker: Function,
+ /** @type {function(string): !Promise<!Object>} */
+ retryCheck: Function,
+ _checkerDescription: String,
+ _startTime: {
+ type: String,
+ computed: '_computeStartTime(check)',
+ },
+ _duration: {
+ type: String,
+ computed: '_computeDuration(check)',
+ },
+ },
+
+ observers: [
+ '_updateCheckerName(check, getChecker)',
+ ],
+
+ /**
+ * @param {!Defs.Check} check
+ * @param {function(string): !Promise<!Object>} getChecker
+ */
+ _updateCheckerName(check, getChecker) {
+ const checkerId = check.checker_uuid;
+ getChecker(checkerId).then(
+ checker => checker && checker.description || checkerId,
+ () => checkerId).then(checkerDescription => {
+ this.set('_checkerDescription', checkerDescription);
+ });
+ },
+
+ /**
+ * @param {!Defs.Check} check
+ * @return {string}
+ */
+ _computeStartTime(check) {
+ return moment(check.created).format('l');
+ },
+
+ /**
+ * @param {!Defs.Check} check
+ * @return {string}
+ */
+ _computeDuration(check) {
+ const startTime = moment(check.created);
+ const finishTime = moment(check.updated);
+ return generateDurationString(
+ moment.duration(finishTime.diff(startTime)));
+ },
+
+ handleClick(event) {
+ event.preventDefault();
+ this.retryCheck(this.check.checker_uuid);
+ },
+ });
+
+ const ZERO_SECONDS = '0 sec';
+
+ /**
+ * @param {!Moment.Duration} duration a moment object
+ * @return {string}
+ */
+ function generateDurationString(duration) {
+ if (duration.asSeconds() === 0) {
+ return ZERO_SECONDS;
+ }
+
+ const durationSegments = [];
+ if (duration.seconds()) {
+ durationSegments.push(`${duration.seconds()} sec`);
+ }
+ if (duration.minutes()) {
+ durationSegments.push(`${duration.minutes()} min`);
+ }
+ if (duration.hours()) {
+ const hours = pluralize(duration.hours(), 'hour', 'hours');
+ durationSegments.push(`${duration.hours()} ${hours}`);
+ }
+ if (duration.days()) {
+ const days = pluralize(duration.days(), 'day', 'days');
+ durationSegments.push(`${duration.days()} ${days}`);
+ }
+ if (duration.months()) {
+ const months = pluralize(duration.months(), 'month', 'months');
+ durationSegments.push(`${duration.months()} ${months}`);
+ }
+ return durationSegments.join(' ');
+ }
+
+ /**
+ * @param {number} unit
+ * @param {string} singular
+ * @param {string} plural
+ * @return {string}
+ */
+ function pluralize(unit, singular, plural) {
+ return unit === 1 ? singular : plural;
+ }
+})();
diff --git a/gr-checks/gr-checks-item_test.html b/gr-checks/gr-checks-item_test.html
new file mode 100644
index 0000000..0495d52
--- /dev/null
+++ b/gr-checks/gr-checks-item_test.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<script src="imports.js"></script>
+<script src="webcomponentsjs/webcomponents-lite.js"></script>
+<link rel="import" href="polymer/polymer.html">
+
+<title>gr-checks-item</title>
+<link rel="import" href="webcomponent_lib/gr-checks-item.html">
+
+<test-fixture id="basic">
+ <template is="dom-template">
+ <gr-checks-item
+ check="{{check}}"
+ get-checker="[[getChecker]]"
+ retry-check="[[retryCheck]]">
+ </gr-checks-item>
+ </template>
+</test-fixture>
+
+<script>
+ suite('gr-checks-item tests', () => {
+ let element;
+ let sandbox;
+ let getCheckerSpy;
+ let resolveGetChecker;
+ let rejectGetChecker;
+ let retryCheckSpy;
+
+ setup((done) => {
+ sandbox = sinon.sandbox.create();
+ const getCheckerPromise = new Promise((resolve, reject) => {
+ resolveGetChecker = resolve;
+ rejectGetChecker = reject;
+ });
+ getCheckerSpy = sinon.stub();
+ getCheckerSpy.returns(getCheckerPromise);
+ retryCheckSpy = sinon.stub();
+ retryCheckSpy.returns(Promise.resolve());
+
+ element = fixture('basic', {
+ getChecker: getCheckerSpy,
+ retryCheck: retryCheckSpy,
+ check: {
+ checkId: 'test-check-id',
+ logUrl: 'http://example.com/test-log-url',
+ startTime: "2019-02-06T22:25:19.269Z",
+ finishTime: "2019-02-06T22:25:44.574Z",
+ },
+ });
+ flush(done);
+ });
+
+ teardown(() => { sandbox.restore(); });
+
+ suite('checker name', () => {
+ test('calls getChecker', () => {
+ assert.isTrue(getCheckerSpy.called);
+ assert.isTrue(getCheckerSpy.calledWith('test-check-id'));
+ });
+
+ function assertCheckerText(text) {
+ const name = element.$$('td:nth-child(1)');
+ assert.equal(name.textContent.trim(), text);
+ }
+
+ suite('on success', () => {
+ setup(done => {
+ resolveGetChecker({description: 'test checker name'});
+ flush(done);
+ });
+
+ test('renders the checker name on success', () => {
+ assertCheckerText('test checker name');
+ });
+ });
+
+ suite('on empty response', () => {
+ setup(done => {
+ resolveGetChecker();
+ flush(done);
+ });
+
+ test('renders the id when there is no description', () => {
+ assertCheckerText('test-check-id');
+ });
+ });
+
+ suite('on error', () => {
+ setup(done => {
+ rejectGetChecker(new Error('broken'));
+ flush(done);
+ });
+
+ test('renders the id when the call fails', () => {
+ assertCheckerText('test-check-id');
+ });
+ });
+ });
+
+ test('renders the status', () => {
+ const status = element.$$('td:nth-child(3) > gr-checks-status');
+ assert.exists(status);
+ });
+
+ test('renders the checking system', () => {
+ const checkingSystem = element.$$('td:nth-child(4)');
+ assert.equal(checkingSystem .textContent.trim(), "Check System");
+ });
+
+ test('renders the run date', () => {
+ const name = element.$$('td:nth-child(5)');
+ assert.equal(name .textContent.trim(), "2/6/2019");
+ });
+
+ suite('duration', () => {
+ test('renders the run duration', () => {
+ const name = element.$$('td:nth-child(6)');
+ assert.equal(name .textContent.trim(), "25 sec");
+ });
+
+ test('renders 0 sec when the start and end time are the same', () => {
+ element.check = {
+ checkId: 'test-check-id',
+ logUrl: 'http://example.com/test-log-url',
+ startTime: "2019-02-06T22:25:19.269Z",
+ finishTime: "2019-02-06T22:25:19.269Z",
+ };
+ const name = element.$$('td:nth-child(6)');
+ assert.equal(name .textContent.trim(), "0 sec");
+ });
+ });
+
+ test('renders a link to the log', () => {
+ const logLink = element.$$('td:nth-child(7) > a');
+ assert.equal(logLink.getAttribute('href'), "http://example.com/test-log-url");
+ assert.equal(logLink.textContent.trim(), "View log");
+ });
+
+ suite('retryCheck', () => {
+ let retryCheckLink;
+
+ setup(() => {
+ retryCheckLink = element.$$('td:nth-child(7) > gr-button');
+ });
+
+ test('shows a link to the log url', () => {
+ assert.equal(retryCheckLink.textContent.trim(), "Re-run");
+ });
+
+ test('clicking on the link calls the retryCheck property', () => {
+ assert.isFalse(retryCheckSpy.called);
+ retryCheckLink.click();
+ assert.isTrue(retryCheckSpy.called);
+ });
+ });
+ });
+</script>
diff --git a/gr-checks/build-result-status.html b/gr-checks/gr-checks-status.html
similarity index 92%
rename from gr-checks/build-result-status.html
rename to gr-checks/gr-checks-status.html
index ca39add..ef4a02a 100644
--- a/gr-checks/build-result-status.html
+++ b/gr-checks/gr-checks-status.html
@@ -1,4 +1,4 @@
-<dom-module id="build-result-status">
+<dom-module id="gr-checks-status">
<template>
<style>
:host {
@@ -62,6 +62,6 @@
</template>
</span>
</template>
- <script src="all-statuses.js"></script>
- <script src="build-result-status.js"></script>
+ <script src="gr-checks-all-statuses.js"></script>
+ <script src="gr-checks-status.js"></script>
</dom-module>
diff --git a/gr-checks/gr-checks-status.js b/gr-checks/gr-checks-status.js
new file mode 100644
index 0000000..e187b20
--- /dev/null
+++ b/gr-checks/gr-checks-status.js
@@ -0,0 +1,37 @@
+(function() {
+'use strict';
+
+Polymer({
+ is: 'gr-checks-status',
+
+ properties: {
+ showText: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+ status: String,
+ _className: {type: String, computed: '_computeClassName(status)'},
+ },
+
+ _isUnevaluated(status) {
+ return window.Gerrit.Checks.isUnevaluated(status);
+ },
+
+ _isInProgress(status) {
+ return window.Gerrit.Checks.isInProgress(status);
+ },
+
+ _isSuccessful(status) {
+ return window.Gerrit.Checks.isSuccessful(status);
+ },
+
+ _isFailed(status) {
+ return window.Gerrit.Checks.isFailed(status);
+ },
+
+ _computeClassName(status) {
+ return window.Gerrit.Checks.statusClass(status);
+ },
+});
+})();
diff --git a/gr-checks/build-result-status_test.html b/gr-checks/gr-checks-status_test.html
similarity index 88%
rename from gr-checks/build-result-status_test.html
rename to gr-checks/gr-checks-status_test.html
index 6592e85..19957a3 100644
--- a/gr-checks/build-result-status_test.html
+++ b/gr-checks/gr-checks-status_test.html
@@ -4,17 +4,17 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>build-result-item</title>
-<link rel="import" href="webcomponent_lib/build-result-status.html">
+<title>gr-checks-item</title>
+<link rel="import" href="webcomponent_lib/gr-checks-status.html">
<test-fixture id="basic">
<template is="dom-template">
- <build-result-status show-text="{{showText}}" status="{{status}}"></build-result-status>
+ <gr-checks-status show-text="{{showText}}" status="{{status}}"></gr-checks-status>
</template>
</test-fixture>
<script>
- suite('build-result-status tests', () => {
+ suite('gr-checks-status tests', () => {
let element;
let sandbox;
diff --git a/gr-checks/build-results-view.html b/gr-checks/gr-checks-view.html
similarity index 72%
rename from gr-checks/build-results-view.html
rename to gr-checks/gr-checks-view.html
index 9f30421..5f1b94e 100644
--- a/gr-checks/build-results-view.html
+++ b/gr-checks/gr-checks-view.html
@@ -1,4 +1,4 @@
-<dom-module id="build-results-view">
+<dom-module id="gr-checks-view">
<template>
<style>
:host {
@@ -10,7 +10,7 @@
width: 100%;
}
- build-result-item {
+ gr-checks-item {
display: table-row;
}
@@ -69,26 +69,26 @@
<template is="dom-if" if="[[_isEmpty(_status)]]">
<div class="no-content">
<h2>No checks ran for this code review</h2>
- <p>Configure code review checks to view the results here.</p>
- <build-results-configure-link configure-path="[[configurePath]]">
- </build-results-configure-link>
+ <p>Configure checkers to view the results here.</p>
+ <gr-checks-configure-link configure-path="[[configurePath]]">
+ </gr-checks-configure-link>
</div>
</template>
<template is="dom-if" if="[[_isNotConfigured(_status)]]">
<div class="no-content">
<h2>Code review checks not configured</h2>
- <p>Configure code review checks to view the results here.</p>
- <build-results-configure-link configure-path="[[configurePath]]">
- </build-results-configure-link>
+ <p>Configure checkers to view the results here.</p>
+ <gr-checks-configure-link configure-path="[[configurePath]]">
+ </gr-checks-configure-link>
</div>
</template>
<template is="dom-if" if="[[_hasResults(_status)]]">
<header>
<h3>Latest checks for Patchset [[revision._number]]</h3>
- <build-results-configure-link configure-path="[[configurePath]]">
- </build-results-configure-link>
+ <gr-checks-configure-link configure-path="[[configurePath]]">
+ </gr-checks-configure-link>
</header>
<table>
@@ -104,13 +104,13 @@
</tr>
</thead>
<tbody>
- <template is="dom-repeat" items="[[_buildResults]]" as="build">
- <build-result-item build="[[build]]" retry-build="[[retryBuild]]" get-trigger="[[getTrigger]]"></build-result-item>
+ <template is="dom-repeat" items="[[_checks]]" as="check">
+ <gr-checks-item check="[[check]]" retry-check="[[retryCheck]]" get-checker="[[getChecker]]"></gr-checks-item>
</template>
</tbody>
</table>
</template>
</template>
- <script src="build-results-view.js"></script>
+ <script src="gr-checks-view.js"></script>
</dom-module>
diff --git a/gr-checks/build-results-view.js b/gr-checks/gr-checks-view.js
similarity index 74%
rename from gr-checks/build-results-view.js
rename to gr-checks/gr-checks-view.js
index ca51876..3f53f61 100644
--- a/gr-checks/build-results-view.js
+++ b/gr-checks/gr-checks-view.js
@@ -27,27 +27,27 @@
};
Polymer({
- is: 'build-results-view',
+ is: 'gr-checks-view',
properties: {
revision: Object,
change: Object,
- // TODO(brohlfs): Implement getBuildResults based on Checks Rest API.
+ // TODO(brohlfs): Implement getChecks based on Checks Rest API.
/** @type {function(string, (string|undefined)): !Promise<!Object>} */
- getBuildResults: Function,
+ getChecks: Function,
// TODO(brohlfs): Implement isConfigured based on Checks Rest API.
/** @type {function(string): !Promise<!Object>} */
isConfigured: Function,
- // TODO(brohlfs): Implement getTrigger based on Checks Rest API.
+ // TODO(brohlfs): Implement getChecker based on Checks Rest API.
/** @type {function(string, string): !Promise<!Object>} */
- getTrigger: Function,
- // TODO(brohlfs): Implement retryBuild based on Checks Rest API.
+ getChecker: Function,
+ // TODO(brohlfs): Implement retryCheck based on Checks Rest API.
/** @type {function(string, string): !Promise<!Object>} */
- retryBuild: Function,
+ retryCheck: Function,
// TODO(brohlfs): Implement configurePath based on Checks Rest API.
- // The url path to configure code review triggers.
+ // The url path to configure checkers.
configurePath: String,
- _buildResults: Object,
+ _checks: Object,
_status: {
type: Object,
value: LoadingStatus.LOADING,
@@ -55,22 +55,22 @@
},
observers: [
- '_fetchBuildResults(change, revision, getBuildResults)',
+ '_fetchChecks(change, revision, getChecks)',
],
/**
* @param {!Defs.Change} change The current CL.
* @param {!Object} revision The current patchset.
* @param {function(string, (string|undefined)): !Promise<!Object>}
- * getBuildResults function to get build results.
+ * getChecks function to get checks.
*/
- _fetchBuildResults(change, revision, getBuildResults) {
+ _fetchChecks(change, revision, getChecks) {
const repository = change['project'];
const gitSha = currentRevisionSha(change, revision);
- getBuildResults(repository, gitSha).then(buildResults => {
- if (buildResults && buildResults.length) {
- this.set('_buildResults', buildResults);
+ getChecks(repository, gitSha).then(checks => {
+ if (checks && checks.length) {
+ this.set('_checks', checks);
this.set('_status', LoadingStatus.RESULTS);
} else {
this._checkConfigured();
diff --git a/gr-checks/build-results-view_test.html b/gr-checks/gr-checks-view_test.html
similarity index 62%
rename from gr-checks/build-results-view_test.html
rename to gr-checks/gr-checks-view_test.html
index 79851a0..6affa9c 100644
--- a/gr-checks/build-results-view_test.html
+++ b/gr-checks/gr-checks-view_test.html
@@ -4,26 +4,26 @@
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
-<title>build-result-item</title>
-<link rel="import" href="webcomponent_lib/build-results-view.html">
+<title>gr-checks-item</title>
+<link rel="import" href="webcomponent_lib/gr-checks-view.html">
<test-fixture id="basic">
<template is="dom-template">
- <build-results-view
+ <gr-checks-view
change="[[change]]"
revision="[[revision]]"
configure-path="[[configurePath]]"
- get-build-results="[[getBuildResults]]"
+ get-checks="[[getChecks]]"
is-configured="[[isConfigured]]"
- get-trigger="[[getTrigger]]"
- retry-build="[[retryBuild]]">
- </build-results-view>
+ get-checker="[[getChecker]]"
+ retry-check="[[retryCheck]]">
+ </gr-checks-view>
</template>
</test-fixture>
<script>
- const BUILD1 = {
- buildTriggerId: 'test-build-trigger-id',
+ const CHECK1 = {
+ checkId: 'test-check-id',
logUrl: 'http://example.com/test-log-url',
startTime: "2019-02-06T22:25:19.269Z",
finishTime: "2019-02-06T22:25:44.574Z",
@@ -44,24 +44,24 @@
},
};
-suite('build-results-view tests', () => {
+suite('gr-checks-view tests', () => {
let element;
let sandbox;
- let getBuildResultsSpy;
- let getBuildResultsResolve;
- let getTriggerSpy;
- let retryBuildSpy;
+ let getChecksSpy;
+ let getChecksResolve;
+ let getCheckerSpy;
+ let retryCheckSpy;
let isConfiguredSpy;
let isConfiguredResolve;
setup((done) => {
sandbox = sinon.sandbox.create();
- getBuildResultsSpy = sinon.stub();
- const getBuildResultsPromise = new Promise((resolve, reject) => {
- getBuildResultsResolve = resolve;
+ getChecksSpy = sinon.stub();
+ const getChecksPromise = new Promise((resolve, reject) => {
+ getChecksResolve = resolve;
});
- getBuildResultsSpy.returns(getBuildResultsPromise);
+ getChecksSpy.returns(getChecksPromise);
isConfiguredSpy = sinon.stub();
const isConfiguredPromise = new Promise((resolve, reject) => {
@@ -69,15 +69,15 @@
});
isConfiguredSpy.returns(isConfiguredPromise);
- getTriggerSpy = sinon.stub();
- getTriggerSpy.returns(Promise.resolve({description: 'test trigger name'}));
- retryBuildSpy = sinon.stub();
- retryBuildSpy.returns(Promise.resolve());
+ getCheckerSpy = sinon.stub();
+ getCheckerSpy.returns(Promise.resolve({description: 'test checker name'}));
+ retryCheckSpy = sinon.stub();
+ retryCheckSpy.returns(Promise.resolve());
element = fixture('basic', {
- getTrigger: getTriggerSpy,
- retryBuild: retryBuildSpy,
- getBuildResults: getBuildResultsSpy,
+ getChecker: getCheckerSpy,
+ retryCheck: retryCheckSpy,
+ getChecks: getChecksSpy,
isConfigured: isConfiguredSpy,
configurePath: 'http://example.com/test-configure',
change: {
@@ -98,18 +98,18 @@
assert.equal(element.textContent.trim(), 'Loading...');
});
- test('queries the builds', () => {
- assert.isTrue(getBuildResultsSpy.called);
- assert.isTrue(getBuildResultsSpy.calledWith('test-repository', 'second-sha'));
+ test('queries the checks', () => {
+ assert.isTrue(getChecksSpy.called);
+ assert.isTrue(getChecksSpy.calledWith('test-repository', 'second-sha'));
});
- suite('no builds returned', () => {
+ suite('no checks returned', () => {
setup((done) => {
- getBuildResultsResolve([]);
+ getChecksResolve([]);
flush(done);
});
- test('it calls to check if the builds are configured', () => {
+ test('it calls to check if the checks are configured', () => {
assert.isTrue(isConfiguredSpy.called);
assert.isTrue(isConfiguredSpy.calledWith('test-repository'));
});
@@ -125,8 +125,8 @@
assert.equal(header.textContent.trim(), 'Code review checks not configured');
});
- test('renders the link to configure a build', () => {
- const configureLink = element.$$('build-results-configure-link');
+ test('renders the link to configure a check', () => {
+ const configureLink = element.$$('gr-checks-configure-link');
assert.exists(configureLink);
});
});
@@ -142,20 +142,20 @@
assert.equal(header.textContent.trim(), 'No checks ran for this code review');
});
- test('renders the link to configure a build', () => {
- const configureLink = element.$$('build-results-configure-link');
+ test('renders the link to configure a check', () => {
+ const configureLink = element.$$('gr-checks-configure-link');
assert.exists(configureLink);
});
});
});
- suite('with build results', () => {
+ suite('with checks', () => {
setup(done => {
- getBuildResultsResolve([BUILD1, BUILD1, BUILD1]);
+ getChecksResolve([CHECK1, CHECK1, CHECK1]);
flush(done);
});
- test('it calls to check if the builds are configured', () => {
+ test('it calls to check if the checks are configured', () => {
assert.isFalse(isConfiguredSpy.called);
});
@@ -164,14 +164,14 @@
assert.equal(header.textContent.trim(), 'Latest checks for Patchset 3');
});
- test('renders the link to configure a build', () => {
- const configureLink = element.$$('header > build-results-configure-link');
+ test('renders the link to configure a check', () => {
+ const configureLink = element.$$('header > gr-checks-configure-link');
assert.exists(configureLink);
});
- test('renders a table of all the builds', () => {
+ test('renders a table of all the checks', () => {
const tbody = element.$$('table > tbody');
- assert.lengthOf(tbody.querySelectorAll('build-result-item'), 3)
+ assert.lengthOf(tbody.querySelectorAll('gr-checks-item'), 3)
});
});
});
diff --git a/gr-checks/gr-checks.html b/gr-checks/gr-checks.html
new file mode 100644
index 0000000..4efdf97
--- /dev/null
+++ b/gr-checks/gr-checks.html
@@ -0,0 +1,28 @@
+<link rel="import" href="gr-checks-view.html">
+<link rel="import" href="gr-checks-item.html">
+<link rel="import" href="gr-checks-status.html">
+<link rel="import" href="gr-checks-chip-view.html">
+<link rel="import" href="gr-checks-change-list-item-cell-view.html">
+<link rel="import" href="gr-checks-change-list-header-view.html">
+<link rel="import" href="gr-checks-change-view-tab-header-view.html">
+<link rel="import" href="gr-checks-configure-link.html">
+
+<dom-module id="gr-checks">
+ <script>
+ Gerrit.install(plugin => {
+ plugin.registerDynamicCustomComponent(
+ 'change-list-header',
+ 'gr-checks-change-list-header-view');
+ plugin.registerDynamicCustomComponent(
+ 'change-list-item-cell',
+ 'gr-checks-change-list-item-cell-view');
+ plugin.registerDynamicCustomComponent(
+ 'change-view-tab-header',
+ 'gr-checks-change-view-tab-header-view');
+ plugin.registerDynamicCustomComponent(
+ 'change-view-tab-content',
+ 'gr-checks-view').onAttached(
+ view => console.log('gr-checks-view attached'));
+ });
+ </script>
+</dom-module>