diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..693b6335 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,63 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 12 + }, + "rules": { + "array-bracket-spacing": "error", + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": "error", + "class-methods-use-this": "error", + "consistent-return": "error", + "default-case": "error", + "default-case-last": "error", + "default-param-last": "error", + "grouped-accessor-pairs": "error", + "indent": [ + "error", + 4 + ], + "linebreak-style": [ + "error", + "unix" + ], + "no-caller": "error", + "no-console": "error", + "no-empty-function": "error", + "no-eval": "error", + "no-extra-parens": "error", + "no-labels": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-wrappers": "error", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-shadow": "error", + "no-throw-literal": "error", + "no-undefined": "error", + "no-unreachable-loop": "error", + "no-unused-expressions": "error", + "no-useless-backreference": "error", + "no-useless-concat": "error", + "no-var": "error", + "prefer-const": "error", + "prefer-promise-reject-errors": "error", + "require-atomic-updates": "error", + "require-await": "error", + "semi": [ + "error", + "always" + ], + "quotes": [ + "error", + "single" + ], + "yoda": "error" + } +} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14a43cd4..e1b7ebd1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,6 +37,13 @@ repos: hooks: - id: pyupgrade args: [--py3-plus] +- repo: https://github.com/pre-commit/mirrors-eslint + rev: v7.13.0 + hooks: + - id: eslint + additional_dependencies: + - eslint@7.13.0 + args: [pytest_html] - repo: local hooks: - id: rst diff --git a/pytest_html/resources/main.js b/pytest_html/resources/main.js index c06cb455..ea9c0a81 100644 --- a/pytest_html/resources/main.js +++ b/pytest_html/resources/main.js @@ -10,7 +10,7 @@ function toArray(iter) { return Array.prototype.slice.call(iter); } -function find(selector, elem) { +function find(selector, elem) { // eslint-disable-line no-redeclare if (!elem) { elem = document; } @@ -26,8 +26,8 @@ function find_all(selector, elem) { function sort_column(elem) { toggle_sort_states(elem); - var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem); - var key; + const colIndex = toArray(elem.parentNode.childNodes).indexOf(elem); + let key; if (elem.classList.contains('numeric')) { key = key_num; } else if (elem.classList.contains('result')) { @@ -40,75 +40,75 @@ function sort_column(elem) { sort_table(elem, key(colIndex)); } -function show_all_extras() { +function show_all_extras() { // eslint-disable-line no-unused-vars find_all('.col-result').forEach(show_extras); } -function hide_all_extras() { +function hide_all_extras() { // eslint-disable-line no-unused-vars find_all('.col-result').forEach(hide_extras); } function show_extras(colresult_elem) { - var extras = colresult_elem.parentNode.nextElementSibling; - var expandcollapse = colresult_elem.firstElementChild; - extras.classList.remove("collapsed"); - expandcollapse.classList.remove("expander"); - expandcollapse.classList.add("collapser"); + const extras = colresult_elem.parentNode.nextElementSibling; + const expandcollapse = colresult_elem.firstElementChild; + extras.classList.remove('collapsed'); + expandcollapse.classList.remove('expander'); + expandcollapse.classList.add('collapser'); } function hide_extras(colresult_elem) { - var extras = colresult_elem.parentNode.nextElementSibling; - var expandcollapse = colresult_elem.firstElementChild; - extras.classList.add("collapsed"); - expandcollapse.classList.remove("collapser"); - expandcollapse.classList.add("expander"); + const extras = colresult_elem.parentNode.nextElementSibling; + const expandcollapse = colresult_elem.firstElementChild; + extras.classList.add('collapsed'); + expandcollapse.classList.remove('collapser'); + expandcollapse.classList.add('expander'); } function show_filters() { - var filter_items = document.getElementsByClassName('filter'); - for (var i = 0; i < filter_items.length; i++) + const filter_items = document.getElementsByClassName('filter'); + for (let i = 0; i < filter_items.length; i++) filter_items[i].hidden = false; } function add_collapse() { // Add links for show/hide all - var resulttable = find('table#results-table'); - var showhideall = document.createElement("p"); + const resulttable = find('table#results-table'); + const showhideall = document.createElement('p'); showhideall.innerHTML = 'Show all details / ' + 'Hide all details'; resulttable.parentElement.insertBefore(showhideall, resulttable); // Add show/hide link to each result find_all('.col-result').forEach(function(elem) { - var collapsed = get_query_parameter('collapsed') || 'Passed'; - var extras = elem.parentNode.nextElementSibling; - var expandcollapse = document.createElement("span"); - if (extras.classList.contains("collapsed")) { - expandcollapse.classList.add("expander") + const collapsed = get_query_parameter('collapsed') || 'Passed'; + const extras = elem.parentNode.nextElementSibling; + const expandcollapse = document.createElement('span'); + if (extras.classList.contains('collapsed')) { + expandcollapse.classList.add('expander'); } else if (collapsed.includes(elem.innerHTML)) { - extras.classList.add("collapsed"); - expandcollapse.classList.add("expander"); + extras.classList.add('collapsed'); + expandcollapse.classList.add('expander'); } else { - expandcollapse.classList.add("collapser"); + expandcollapse.classList.add('collapser'); } elem.appendChild(expandcollapse); - elem.addEventListener("click", function(event) { - if (event.currentTarget.parentNode.nextElementSibling.classList.contains("collapsed")) { + elem.addEventListener('click', function(event) { + if (event.currentTarget.parentNode.nextElementSibling.classList.contains('collapsed')) { show_extras(event.currentTarget); } else { hide_extras(event.currentTarget); } }); - }) + }); } function get_query_parameter(name) { - var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); + const match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); } -function init () { +function init () { // eslint-disable-line no-unused-vars reset_sort_headers(); add_collapse(); @@ -118,52 +118,51 @@ function init () { sort_column(find('.initial-sort')); find_all('.sortable').forEach(function(elem) { - elem.addEventListener("click", - function(event) { - sort_column(elem); - }, false) + elem.addEventListener('click', + function() { + sort_column(elem); + }, false); }); - -}; +} function sort_table(clicked, key_func) { - var rows = find_all('.results-table-row'); - var reversed = !clicked.classList.contains('asc'); - var sorted_rows = sort(rows, key_func, reversed); + const rows = find_all('.results-table-row'); + const reversed = !clicked.classList.contains('asc'); + const sorted_rows = sort(rows, key_func, reversed); /* Whole table is removed here because browsers acts much slower * when appending existing elements. */ - var thead = document.getElementById("results-table-head"); + const thead = document.getElementById('results-table-head'); document.getElementById('results-table').remove(); - var parent = document.createElement("table"); - parent.id = "results-table"; + const parent = document.createElement('table'); + parent.id = 'results-table'; parent.appendChild(thead); sorted_rows.forEach(function(elem) { parent.appendChild(elem); }); - document.getElementsByTagName("BODY")[0].appendChild(parent); + document.getElementsByTagName('BODY')[0].appendChild(parent); } function sort(items, key_func, reversed) { - var sort_array = items.map(function(item, i) { + const sort_array = items.map(function(item, i) { return [key_func(item), i]; }); sort_array.sort(function(a, b) { - var key_a = a[0]; - var key_b = b[0]; + const key_a = a[0]; + const key_b = b[0]; if (key_a == key_b) return 0; if (reversed) { - return (key_a < key_b ? 1 : -1); + return key_a < key_b ? 1 : -1; } else { - return (key_a > key_b ? 1 : -1); + return key_a > key_b ? 1 : -1; } }); return sort_array.map(function(item) { - var index = item[1]; + const index = item[1]; return items[index]; }); } @@ -182,15 +181,15 @@ function key_num(col_index) { function key_link(col_index) { return function(elem) { - dataCell = elem.childNodes[1].childNodes[col_index].firstChild - return dataCell == null ? "" : dataCell.innerText.toLowerCase(); + const dataCell = elem.childNodes[1].childNodes[col_index].firstChild; + return dataCell == null ? '' : dataCell.innerText.toLowerCase(); }; } function key_result(col_index) { return function(elem) { - var strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed', - 'Skipped', 'Passed']; + const strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed', + 'Skipped', 'Passed']; return strings.indexOf(elem.childNodes[1].childNodes[col_index].firstChild.data); }; } @@ -200,12 +199,12 @@ function reset_sort_headers() { elem.parentNode.removeChild(elem); }); find_all('.sortable').forEach(function(elem) { - var icon = document.createElement("div"); - icon.className = "sort-icon"; - icon.textContent = "vvv"; + const icon = document.createElement('div'); + icon.className = 'sort-icon'; + icon.textContent = 'vvv'; elem.insertBefore(icon, elem.firstChild); - elem.classList.remove("desc", "active"); - elem.classList.add("asc", "inactive"); + elem.classList.remove('desc', 'active'); + elem.classList.add('asc', 'inactive'); }); } @@ -225,21 +224,21 @@ function toggle_sort_states(elem) { } function is_all_rows_hidden(value) { - return value.hidden == false; + return value.hidden == false; } -function filter_table(elem) { - var outcome_att = "data-test-result"; - var outcome = elem.getAttribute(outcome_att); - class_outcome = outcome + " results-table-row"; - var outcome_rows = document.getElementsByClassName(class_outcome); +function filter_table(elem) { // eslint-disable-line no-unused-vars + const outcome_att = 'data-test-result'; + const outcome = elem.getAttribute(outcome_att); + const class_outcome = outcome + ' results-table-row'; + const outcome_rows = document.getElementsByClassName(class_outcome); - for(var i = 0; i < outcome_rows.length; i++){ + for(let i = 0; i < outcome_rows.length; i++){ outcome_rows[i].hidden = !elem.checked; } - var rows = find_all('.results-table-row').filter(is_all_rows_hidden); - var all_rows_hidden = rows.length == 0 ? true : false; - var not_found_message = document.getElementById("not-found-message"); + const rows = find_all('.results-table-row').filter(is_all_rows_hidden); + const all_rows_hidden = rows.length == 0 ? true : false; + const not_found_message = document.getElementById('not-found-message'); not_found_message.hidden = !all_rows_hidden; }