You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by bb...@apache.org on 2022/04/13 18:43:18 UTC

[airflow] branch consistent-duration-format created (now 6b69b4b09f)

This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a change to branch consistent-duration-format
in repository https://gitbox.apache.org/repos/asf/airflow.git


      at 6b69b4b09f move convertSecsToHumanReadable to datetime_utils

This branch includes the following new commits:

     new 3638b4fbad Make duration formats more consistent
     new 6b69b4b09f move convertSecsToHumanReadable to datetime_utils

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[airflow] 02/02: move convertSecsToHumanReadable to datetime_utils

Posted by bb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a commit to branch consistent-duration-format
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 6b69b4b09f024199113e620177496464c87de98a
Author: Brent Bovenzi <br...@gmail.com>
AuthorDate: Wed Apr 13 14:41:29 2022 -0400

    move convertSecsToHumanReadable to datetime_utils
---
 airflow/www/static/js/datetime_utils.js           | 35 ++++++++++++-
 airflow/www/static/js/graph.js                    |  3 +-
 airflow/www/static/js/main.js                     | 35 +------------
 airflow/www/static/js/task_instances.js           |  4 +-
 airflow/www/static/js/tree/dagRuns/index.test.jsx | 60 ++++++++++++-----------
 5 files changed, 71 insertions(+), 66 deletions(-)

diff --git a/airflow/www/static/js/datetime_utils.js b/airflow/www/static/js/datetime_utils.js
index 729bb89e15..bfb716c5c6 100644
--- a/airflow/www/static/js/datetime_utils.js
+++ b/airflow/www/static/js/datetime_utils.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-/* global moment, $, document, convertSecsToHumanReadable */
+/* global moment, $, document */
 export const defaultFormat = 'YYYY-MM-DD, HH:mm:ss';
 export const defaultFormatWithTZ = 'YYYY-MM-DD, HH:mm:ss z';
 export const defaultTZFormat = 'z (Z)';
@@ -25,6 +25,39 @@ export const dateTimeAttrFormat = 'YYYY-MM-DDThh:mm:ssTZD';
 
 export const TimezoneEvent = 'timezone';
 
+export function convertSecsToHumanReadable(seconds) {
+  const oriSeconds = seconds;
+  const floatingPart = oriSeconds - Math.floor(oriSeconds);
+
+  seconds = Math.floor(seconds);
+
+  const secondsPerHour = 60 * 60;
+  const secondsPerMinute = 60;
+
+  const hours = Math.floor(seconds / secondsPerHour);
+  seconds -= hours * secondsPerHour;
+
+  const minutes = Math.floor(seconds / secondsPerMinute);
+  seconds -= minutes * secondsPerMinute;
+
+  let readableFormat = '';
+  if (hours > 0) {
+    readableFormat += `${hours}Hours `;
+  }
+  if (minutes > 0) {
+    readableFormat += `${minutes}Min `;
+  }
+  if (seconds + floatingPart > 0) {
+    if (Math.floor(oriSeconds) === oriSeconds) {
+      readableFormat += `${seconds}Sec`;
+    } else {
+      seconds += floatingPart;
+      readableFormat += `${seconds.toFixed(3)}Sec`;
+    }
+  }
+  return readableFormat;
+}
+
 export function formatTimezone(what) {
   if (what instanceof moment) {
     return what.isUTC() ? 'UTC' : what.format(defaultTZFormat);
diff --git a/airflow/www/static/js/graph.js b/airflow/www/static/js/graph.js
index ea7fc10cb7..cd41bed5ae 100644
--- a/airflow/www/static/js/graph.js
+++ b/airflow/www/static/js/graph.js
@@ -21,13 +21,14 @@
 
 /*
   global d3, document, nodes, taskInstances, tasks, edges, dagreD3, localStorage, $,
-  autoRefreshInterval, moment, convertSecsToHumanReadable
+  autoRefreshInterval, moment,
 */
 
 import { getMetaValue, finalStatesMap } from './utils';
 import { escapeHtml } from './main';
 import tiTooltip, { taskNoInstanceTooltip } from './task_instances';
 import { callModal } from './dag';
+import { convertSecsToHumanReadable } from './datetime_utils';
 
 // dagId comes from dag.html
 const dagId = getMetaValue('dag_id');
diff --git a/airflow/www/static/js/main.js b/airflow/www/static/js/main.js
index 878a32bb66..6b63fabd56 100644
--- a/airflow/www/static/js/main.js
+++ b/airflow/www/static/js/main.js
@@ -61,6 +61,7 @@ function changeDisplayedTimezone(tz) {
 
 const el = document.createElement('span');
 
+// eslint-disable-next-line import/prefer-default-export
 export function escapeHtml(text) {
   el.textContent = text;
   return el.innerHTML;
@@ -68,40 +69,6 @@ export function escapeHtml(text) {
 
 window.escapeHtml = escapeHtml;
 
-export function convertSecsToHumanReadable(seconds) {
-  const oriSeconds = seconds;
-  const floatingPart = oriSeconds - Math.floor(oriSeconds);
-
-  seconds = Math.floor(seconds);
-
-  const secondsPerHour = 60 * 60;
-  const secondsPerMinute = 60;
-
-  const hours = Math.floor(seconds / secondsPerHour);
-  seconds -= hours * secondsPerHour;
-
-  const minutes = Math.floor(seconds / secondsPerMinute);
-  seconds -= minutes * secondsPerMinute;
-
-  let readableFormat = '';
-  if (hours > 0) {
-    readableFormat += `${hours}Hours `;
-  }
-  if (minutes > 0) {
-    readableFormat += `${minutes}Min `;
-  }
-  if (seconds + floatingPart > 0) {
-    if (Math.floor(oriSeconds) === oriSeconds) {
-      readableFormat += `${seconds}Sec`;
-    } else {
-      seconds += floatingPart;
-      readableFormat += `${seconds.toFixed(3)}Sec`;
-    }
-  }
-  return readableFormat;
-}
-window.convertSecsToHumanReadable = convertSecsToHumanReadable;
-
 function postAsForm(url, parameters) {
   const form = $('<form></form>');
 
diff --git a/airflow/www/static/js/task_instances.js b/airflow/www/static/js/task_instances.js
index 4b6482c5d7..bd43e410f8 100644
--- a/airflow/www/static/js/task_instances.js
+++ b/airflow/www/static/js/task_instances.js
@@ -17,11 +17,11 @@
  * under the License.
  */
 
-/* global window, moment, convertSecsToHumanReadable */
+/* global window, moment */
 
 // We don't re-import moment again, otherwise webpack will include it twice in the bundle!
 import { escapeHtml } from './main';
-import { defaultFormat, formatDateTime } from './datetime_utils';
+import { defaultFormat, formatDateTime, convertSecsToHumanReadable } from './datetime_utils';
 import { dagTZ } from './dag';
 import { finalStatesMap } from './utils';
 
diff --git a/airflow/www/static/js/tree/dagRuns/index.test.jsx b/airflow/www/static/js/tree/dagRuns/index.test.jsx
index 5faa8b6e95..5a4f94c2ea 100644
--- a/airflow/www/static/js/tree/dagRuns/index.test.jsx
+++ b/airflow/www/static/js/tree/dagRuns/index.test.jsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-/* global describe, test, expect */
+/* global describe, test, expect, beforeAll */
 
 import React from 'react';
 import { render } from '@testing-library/react';
@@ -30,8 +30,7 @@ import { ContainerRefProvider } from '../context/containerRef';
 import { SelectionProvider } from '../context/selection';
 import { TimezoneProvider } from '../context/timezone';
 import { AutoRefreshProvider } from '../context/autorefresh';
-
-global.moment = moment;
+import { convertSecsToHumanReadable } from '../../datetime_utils';
 
 const Wrapper = ({ children }) => {
   const queryClient = new QueryClient();
@@ -58,30 +57,35 @@ const Wrapper = ({ children }) => {
   );
 };
 
+const dagRuns = [
+  {
+    dagId: 'dagId',
+    runId: 'run1',
+    dataIntervalStart: new Date(),
+    dataIntervalEnd: new Date(),
+    startDate: '2021-11-08T21:14:19.704433+00:00',
+    endDate: '2021-11-08T21:17:13.206426+00:00',
+    state: 'failed',
+    runType: 'scheduled',
+    executionDate: '2021-11-08T21:14:19.704433+00:00',
+  },
+  {
+    dagId: 'dagId',
+    runId: 'run2',
+    dataIntervalStart: new Date(),
+    dataIntervalEnd: new Date(),
+    state: 'success',
+    runType: 'manual',
+    startDate: '2021-11-09T00:19:43.023200+00:00',
+    endDate: '2021-11-09T00:22:18.607167+00:00',
+  },
+];
+
 describe('Test DagRuns', () => {
-  const dagRuns = [
-    {
-      dagId: 'dagId',
-      runId: 'run1',
-      dataIntervalStart: new Date(),
-      dataIntervalEnd: new Date(),
-      startDate: '2021-11-08T21:14:19.704433+00:00',
-      endDate: '2021-11-08T21:17:13.206426+00:00',
-      state: 'failed',
-      runType: 'scheduled',
-      executionDate: '2021-11-08T21:14:19.704433+00:00',
-    },
-    {
-      dagId: 'dagId',
-      runId: 'run2',
-      dataIntervalStart: new Date(),
-      dataIntervalEnd: new Date(),
-      state: 'success',
-      runType: 'manual',
-      startDate: '2021-11-09T00:19:43.023200+00:00',
-      endDate: '2021-11-09T00:22:18.607167+00:00',
-    },
-  ];
+  beforeAll(() => {
+    global.moment = moment;
+    global.convertSecsToHumanReadable = convertSecsToHumanReadable;
+  });
 
   test('Durations and manual run arrow render correctly, but without any date ticks', () => {
     global.treeData = JSON.stringify({
@@ -94,8 +98,8 @@ describe('Test DagRuns', () => {
     expect(queryAllByTestId('run')).toHaveLength(2);
     expect(queryAllByTestId('manual-run')).toHaveLength(1);
 
-    expect(getByText('00:02:53')).toBeInTheDocument();
-    expect(getByText('00:01:26')).toBeInTheDocument();
+    expect(getByText('2Min 53.502Sec')).toBeInTheDocument();
+    expect(getByText('1Min 26.751Sec')).toBeInTheDocument();
     expect(queryByText(moment.utc(dagRuns[0].executionDate).format('MMM DD, HH:mm'))).toBeNull();
   });
 


[airflow] 01/02: Make duration formats more consistent

Posted by bb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a commit to branch consistent-duration-format
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 3638b4fbada9750c78f514bbca2e269cd10604a4
Author: Brent Bovenzi <br...@gmail.com>
AuthorDate: Wed Apr 13 14:27:21 2022 -0400

    Make duration formats more consistent
    
    Use the same formatting function, `convertSecsToHumanReadable()`, in Grid view as we have for other js files.
---
 airflow/www/static/js/datetime_utils.js      | 8 +++-----
 airflow/www/static/js/tree/dagRuns/index.jsx | 2 +-
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/airflow/www/static/js/datetime_utils.js b/airflow/www/static/js/datetime_utils.js
index 1cbd6fa2d9..729bb89e15 100644
--- a/airflow/www/static/js/datetime_utils.js
+++ b/airflow/www/static/js/datetime_utils.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-/* global moment, $, document */
+/* global moment, $, document, convertSecsToHumanReadable */
 export const defaultFormat = 'YYYY-MM-DD, HH:mm:ss';
 export const defaultFormatWithTZ = 'YYYY-MM-DD, HH:mm:ss z';
 export const defaultTZFormat = 'z (Z)';
@@ -106,10 +106,8 @@ export const getDuration = (startDate, endDate) => (
 );
 
 export const formatDuration = (dur) => {
-  const duration = moment.duration(dur);
-  const days = duration.days();
-  // .as('milliseconds') is necessary for .format() to work correctly
-  return `${days > 0 ? `${days}d` : ''}${moment.utc(duration.as('milliseconds')).format('HH:mm:ss')}`;
+  const duration = moment.duration(dur).as('seconds');
+  return convertSecsToHumanReadable(duration);
 };
 
 export const approxTimeFromNow = (dur) => {
diff --git a/airflow/www/static/js/tree/dagRuns/index.jsx b/airflow/www/static/js/tree/dagRuns/index.jsx
index ed3918db8a..f4874563ad 100644
--- a/airflow/www/static/js/tree/dagRuns/index.jsx
+++ b/airflow/www/static/js/tree/dagRuns/index.jsx
@@ -80,7 +80,7 @@ const DagRuns = ({ tableWidth }) => {
             {formatDuration(max / 2)}
           </DurationTick>
           <DurationTick bottom={0}>
-            00:00:00
+            0Sec
           </DurationTick>
         </>
         )}