diff --git a/.ci/lint-js.sh b/.ci/lint-js.sh new file mode 100644 index 000000000000..534f251620e2 --- /dev/null +++ b/.ci/lint-js.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e -E -u -o pipefail + +biome ci --config-path=./biome.json --diagnostic-level=info --error-on-warnings ./ diff --git a/.ci/lint-python.sh b/.ci/lint-python-bash.sh similarity index 100% rename from .ci/lint-python.sh rename to .ci/lint-python-bash.sh diff --git a/.ci/test.sh b/.ci/test.sh index f959af16ccf3..45ee65629744 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -103,6 +103,7 @@ if [[ $TASK == "lint" ]]; then pwsh -file "./.ci/lint-powershell.ps1" || : conda create -q -y -n "${CONDA_ENV}" \ "${CONDA_PYTHON_REQUIREMENT}" \ + 'biome>=1.9.3' \ 'cmakelint>=1.4.3' \ 'cpplint>=1.6.0' \ 'matplotlib-base>=3.9.1' \ @@ -113,12 +114,14 @@ if [[ $TASK == "lint" ]]; then 'r-lintr>=3.1.2' # shellcheck disable=SC1091 source activate "${CONDA_ENV}" - echo "Linting Python code" - bash ./.ci/lint-python.sh || exit 1 + echo "Linting Python and bash code" + bash ./.ci/lint-python-bash.sh || exit 1 echo "Linting R code" Rscript ./.ci/lint-r-code.R "${BUILD_DIRECTORY}" || exit 1 echo "Linting C++ code" bash ./.ci/lint-cpp.sh || exit 1 + echo "Linting JavaScript code" + bash ./.ci/lint-js.sh || exit 1 exit 0 fi diff --git a/.editorconfig b/.editorconfig index f4ae446b64bb..e7191b63c1d3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,22 +1,19 @@ root = true [*] -charset=utf-8 +charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +end_of_line = lf indent_style = space indent_size = 2 -[*.{py,sh,js,ps1}] +[*.{py,sh,ps1,js,json}] indent_size = 4 -line_length = 120 +max_line_length = 120 skip = external_libs known_first_party = lightgbm -# Placeholder files -[{*.gitkeep,__init__.py}] -insert_final_newline = none - # Tabs matter for Makefile and .gitmodules [{makefile*,Makefile*,*.mk,*.mak,*.makefile,*.Makefile,GNUmakefile,BSDmakefile,make.bat,Makevars*,*.gitmodules}] indent_style = tab diff --git a/biome.json b/biome.json new file mode 100644 index 000000000000..5029d037189e --- /dev/null +++ b/biome.json @@ -0,0 +1,21 @@ +{ + "files": { + "ignore": [".mypy_cache/"] + }, + "formatter": { + "enabled": true, + "useEditorconfig": true + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "all": true + } + }, + "javascript": { + "globals": ["$"] + } +} diff --git a/docs/_static/js/script.js b/docs/_static/js/script.js index 3cfc90de887d..3f129501e06f 100644 --- a/docs/_static/js/script.js +++ b/docs/_static/js/script.js @@ -1,56 +1,69 @@ -$(function() { +$(() => { /* Use wider container for the page content */ - $('.wy-nav-content').each(function() { this.style.setProperty('max-width', 'none', 'important'); }); + $(".wy-nav-content").each(function () { + this.style.setProperty("max-width", "none", "important"); + }); /* List each class property item on a new line https://github.com/microsoft/LightGBM/issues/5073 */ - if(window.location.pathname.toLocaleLowerCase().indexOf('pythonapi') !== -1) { - $('.py.property').each(function() { this.style.setProperty('display', 'inline', 'important'); }); + if (window.location.pathname.toLocaleLowerCase().indexOf("pythonapi") !== -1) { + $(".py.property").each(function () { + this.style.setProperty("display", "inline", "important"); + }); } /* Collapse specified sections in the installation guide */ - if(window.location.pathname.toLocaleLowerCase().indexOf('installation-guide') !== -1) { - $('').appendTo('body'); - var collapsable = [ - '#build-threadless-version-not-recommended', - '#build-mpi-version', - '#build-gpu-version', - '#build-cuda-version', - '#build-java-wrapper', - '#build-c-unit-tests' + if (window.location.pathname.toLocaleLowerCase().indexOf("installation-guide") !== -1) { + $( + '', + ).appendTo("body"); + const collapsable = [ + "#build-threadless-version-not-recommended", + "#build-mpi-version", + "#build-gpu-version", + "#build-cuda-version", + "#build-java-wrapper", + "#build-c-unit-tests", ]; - $.each(collapsable, function(_, val) { - var header = val + ' > :header:first'; - var content = val + ' :not(:header:first)'; - $(header).addClass('closed'); + $.each(collapsable, (_, val) => { + const header = `${val} > :header:first`; + const content = `${val} :not(:header:first)`; + $(header).addClass("closed"); $(content).hide(); - $(header).click(function() { - $(header).toggleClass('closed opened'); + $(header).click(() => { + $(header).toggleClass("closed opened"); $(content).slideToggle(0); }); }); /* Uncollapse parent sections when nested section is specified in the URL or before navigate to it from navbar */ function uncollapse(section) { - section.parents().each((_, val) => { $(val).children('.closed').click(); }); + section.parents().each((_, val) => { + $(val).children(".closed").click(); + }); } uncollapse($(window.location.hash)); - $('.wy-menu.wy-menu-vertical li a.reference.internal').click(function() { - uncollapse($($(this).attr('href'))); + $(".wy-menu.wy-menu-vertical li a.reference.internal").click(function () { + uncollapse($($(this).attr("href"))); }); /* Modify src and href attrs of artifacts badge */ function modifyBadge(src, href) { - $('img[alt="download artifacts"]').each(function() { + $('img[alt="download artifacts"]').each(function () { this.src = src; this.parentNode.href = href; }); } /* Initialize artifacts badge */ - modifyBadge('./_static/images/artifacts-fetching.svg', '#'); + modifyBadge("./_static/images/artifacts-fetching.svg", "#"); /* Fetch latest buildId and construct artifacts badge */ - $.getJSON('https://dev.azure.com/lightgbm-ci/lightgbm-ci/_apis/build/builds?branchName=refs/heads/master&resultFilter=succeeded&queryOrder=finishTimeDescending&%24top=1&api-version=7.1-preview.7', function(data) { - modifyBadge('./_static/images/artifacts-download.svg', - 'https://dev.azure.com/lightgbm-ci/lightgbm-ci/_apis/build/builds/' + data['value'][0]['id'] + '/artifacts?artifactName=PackageAssets&api-version=7.1-preview.5&%24format=zip'); - }); + $.getJSON( + "https://dev.azure.com/lightgbm-ci/lightgbm-ci/_apis/build/builds?branchName=refs/heads/master&resultFilter=succeeded&queryOrder=finishTimeDescending&%24top=1&api-version=7.1-preview.7", + (data) => { + modifyBadge( + "./_static/images/artifacts-download.svg", + `https://dev.azure.com/lightgbm-ci/lightgbm-ci/_apis/build/builds/${data.value[0].id}/artifacts?artifactName=PackageAssets&api-version=7.1-preview.5&%24format=zip`, + ); + }, + ); } }); diff --git a/examples/binary_classification/forced_splits.json b/examples/binary_classification/forced_splits.json index 1ee410c9789e..b09391a87f49 100644 --- a/examples/binary_classification/forced_splits.json +++ b/examples/binary_classification/forced_splits.json @@ -1,6 +1,6 @@ { "feature": 25, - "threshold": 1.30, + "threshold": 1.3, "left": { "feature": 26, "threshold": 0.85 diff --git a/examples/regression/forced_bins.json b/examples/regression/forced_bins.json index 1ee0a49d727c..19722afbbb4b 100644 --- a/examples/regression/forced_bins.json +++ b/examples/regression/forced_bins.json @@ -1,10 +1,10 @@ [ { "feature": 0, - "bin_upper_bound": [ 0.3, 0.35, 0.4 ] + "bin_upper_bound": [0.3, 0.35, 0.4] }, { "feature": 1, - "bin_upper_bound": [ -0.1, -0.15, -0.2 ] + "bin_upper_bound": [-0.1, -0.15, -0.2] } ] diff --git a/examples/regression/forced_bins2.json b/examples/regression/forced_bins2.json index f4dca0ccaf34..d6454f8a4ae9 100644 --- a/examples/regression/forced_bins2.json +++ b/examples/regression/forced_bins2.json @@ -1,6 +1,6 @@ [ { "feature": 0, - "bin_upper_bound": [ 0.19, 0.39, 0.59, 0.79 ] + "bin_upper_bound": [0.19, 0.39, 0.59, 0.79] } ] diff --git a/python-package/README.rst b/python-package/README.rst index 0e007e5ee7ec..face6bba6b74 100644 --- a/python-package/README.rst +++ b/python-package/README.rst @@ -286,7 +286,7 @@ To check that a contribution to the package matches its style expectations, run .. code:: sh - bash .ci/lint-python.sh + bash .ci/lint-python-bash.sh .. |License| image:: https://img.shields.io/github/license/microsoft/lightgbm.svg :target: https://github.com/microsoft/LightGBM/blob/master/LICENSE