diff --git a/.github/workflows/.tests-javascript.yml b/.github/workflows/.tests-javascript.yml new file mode 100644 index 0000000..4a2f96a --- /dev/null +++ b/.github/workflows/.tests-javascript.yml @@ -0,0 +1,30 @@ +name: Javascript CI + +on: + push: + paths: ['rdltr_front/**'] + pull_request: + paths: ['rdltr_front/**'] + +env: + working-directory: rdltr_front + +jobs: + javascript: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install yarn and dependencies + working-directory: ${{env.working-directory}} + run: | + npm install --global yarn + yarn install + - name: Lint + working-directory: ${{env.working-directory}} + run: yarn lint + - name: Type check + working-directory: ${{env.working-directory}} + run: yarn type-check + - name: Build + working-directory: ${{env.working-directory}} + run: yarn build diff --git a/.github/workflows/.tests-python.yml b/.github/workflows/.tests-python.yml new file mode 100644 index 0000000..1bb4481 --- /dev/null +++ b/.github/workflows/.tests-python.yml @@ -0,0 +1,74 @@ +name: Python CI + +on: + push: + paths-ignore: ['docs/**', 'docsrc/**', 'rdltr_front/**', '*.md'] + pull_request: + paths-ignore: ['docs/**', 'docsrc/**', 'rdltr_front/**', '*.md'] + +jobs: + python: + name: python ${{ matrix.python-version }} + runs-on: ubuntu-latest + container: python:${{ matrix.python-version }} + strategy: + matrix: + python-version: [ "3.8", "3.9", "3.10", "3.11" , "3.12"] + env: + RDLTR_SETTINGS: 'rdltr.config.TestingConfig' + steps: + - uses: actions/checkout@v3 + - name: Create and source virtual environment + run: | + python3 -m venv .venv + . .venv/bin/activate + - name: Install dependencies + run: python3 -m pip install -e .[test] + - name: Bandit + if: matrix.python-version == '3.11' + run: bandit -r rdltr -c pyproject.toml + - name: Lint (flake8, isort & black) + if: matrix.python-version == '3.11' + run: | + pytest --isort --black -m "isort or black" rdltr + flake8 rdltr + - name: Mypy + if: matrix.python-version == '3.11' + run: mypy rdltr + - name: Pytest + run: pytest rdltr/tests/tests --cov rdltr --cov-report term-missing + + end2end: + name: e2e tests + runs-on: ubuntu-latest + needs: ["python"] + container: python:3.11 + services: + selenium: + image: selenium/standalone-firefox + env: + RDLTR_HOST: '0.0.0.0' + RDLTR_SETTINGS: 'rdltr.config.TestingConfig' + RDLTR_DB_TEST_URL: 'sqlite:////tmp/rdltr_test.db' + steps: + - uses: actions/checkout@v3 + - name: Update pip and install build + run: python3 -m pip install --upgrade pip build + - name: Create and source virtual environment + run: | + python3 -m venv .venv + . .venv/bin/activate + - name: Build rdltr package + run: python3 -m build + - name: Install rdltr package + run: python3 -m pip install dist/rdltr-$(cat VERSION).tar.gz + - name: Run migrations + run: rdltr_db + - name: Install pytest and selenium + run: python3 -m pip install pytest==7.4.0 pytest-selenium==4.0.1 selenium==4.9.0 pytest-html==3.2.0 + - name: Start application and run tests with Selenium + run: | + setsid nohup rdltr >> nohup.out 2>&1 & + export RDLTR_HOST=$(hostname --ip-address) + sleep 5 + pytest rdltr/tests/ui_tests --driver Remote --capability browserName firefox --selenium-host selenium --selenium-port 4444 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 13a8986..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,65 +0,0 @@ -image: python:3.11 - -stages: - - tests - - selenium - -.python: - stage: tests - before_script: - - pip install -e .[test] - script: - - pytest rdltr/tests/tests --cov rdltr --cov-report term-missing - -lint: - extends: .python - script: - - pytest --isort --black -m "isort or black" rdltr - - flake8 rdltr - -type-check: - extends: .python - script: - - mypy rdltr - -python-3.8: - extends: .python - image: python:3.8 - -python-3.9: - extends: .python - image: python:3.9 - -python-3.10: - extends: .python - image: python:3.10 - -python-3.11: - stage: tests - before_script: - - pip install -e .[test] - - pip install coveralls - - echo "FAILED" > .job_status - script: - - pytest rdltr/tests/tests --cov rdltr --cov-report term-missing - - echo "SUCCESS" > .job_status - after_script: - - if [ "$(cat .job_status)" == "SUCCESS" ]; then GIT_BRANCH="${CI_COMMIT_REF_NAME}" coveralls; fi - -firefox: - stage: selenium - services: - - name: selenium/standalone-firefox - alias: selenium - variables: - RDLTR_HOST: '0.0.0.0' - RDLTR_SETTINGS: 'rdltr.config.TestingConfig' - RDLTR_DB_TEST_URL: 'sqlite:////tmp/rdltr_test.db' - before_script: - - pip install -e .[test] - script: - - rdltr_db - - setsid nohup rdltr > nohup.out & - - export RDLTR_HOST=$(hostname --ip-address) - - sleep 5 - - pytest rdltr/tests/ui_tests --driver Remote --capability browserName firefox --selenium-host selenium --selenium-port 4444 diff --git a/CHANGELOG.md b/CHANGELOG.md index dccac1d..34d76e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## Version 0.1.15 (2024/01/07) + +No new features, only dependencies update + +### Misc + +* [#49](https://github.com/SamR1/rdltr/issues/49) - upgrade to Vue3 + + ## Version 0.1.14 (2023/06/14) No new features, only dependencies update diff --git a/Makefile b/Makefile index 86d931b..35019ca 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,11 @@ bandit: build-client: cd rdltr_front && $(NPM) run build -check-python: bandit lint-python type-check test +check-all: check-front check-python + +check-front: lint-front type-check-front + +check-python: bandit lint-python type-check-python test clean: rm -fr .pytest_cache @@ -46,7 +50,7 @@ install: install-python install-front install-front: # NPM_ARGS="--ignore-engines", if errors with Node latest version - cd rdltr_front && $(NPM) install --prod $(NPM_ARGS) + cd rdltr_front && $(NPM) install $(NPM_ARGS) install-python: test -d $(VENV) || $(PYTHON_VERSION) -m venv $(VENV) @@ -63,9 +67,6 @@ lint-python: echo 'Running flake8...' $(FLAKE8) $(FLASK_APP) -lint-python-fix: - $(BLACK) $(FLASK_APP) - migrate-db: $(FLASK) db migrate @@ -77,7 +78,7 @@ serve: $(MAKE) P="serve-python serve-front" make-p serve-front: - cd rdltr_front && $(NPM) serve + cd rdltr_front && $(NPM) dev serve-python: echo 'Running on http://$(HOST):$(PORT)' @@ -89,7 +90,12 @@ test: test-ui: $(PYTEST) $(FLASK_APP)/tests/ui_tests --driver firefox $(PYTEST_ARGS) -type-check: +type-check-all: type-check-python type-check-front + +type-check-front: + cd rdltr_front && $(NPM) type-check + +type-check-python: echo 'Running mypy...' $(MYPY) $(FLASK_APP) diff --git a/README.md b/README.md index ec7665b..722624d 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ [![PyPI version](https://img.shields.io/pypi/v/rdltr.svg)](https://pypi.org/project/rdltr/) [![Python Version](https://img.shields.io/badge/python-3.8+-brightgreen.svg)](https://python.org) -[![Flask Version](https://img.shields.io/badge/flask-2.3-brightgreen.svg)](http://flask.pocoo.org/) -[![Vue Version](https://img.shields.io/badge/vue-2.7-brightgreen.svg)](https://vuejs.org/) +[![Flask Version](https://img.shields.io/badge/flask-3.0-brightgreen.svg)](http://flask.pocoo.org/) +[![Vue Version](https://img.shields.io/badge/vue-3.4-brightgreen.svg)](https://vuejs.org/) [![code style: black](https://img.shields.io/badge/code%20style-black-black)](https://github.com/psf/black) [![type check: mypy](https://img.shields.io/badge/type%20check-mypy-blue)](http://mypy-lang.org/) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) diff --git a/VERSION b/VERSION index 71d6a66..c34958a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.14 +0.1.15 diff --git a/docs/.buildinfo b/docs/.buildinfo index 0241b66..573a282 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e5be6c2373d9dd8d40bb6e7e963bda6c +config: fc843008c51d68bc4a677259caa19800 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_sources/changelog.md.txt b/docs/_sources/changelog.md.txt index dccac1d..34d76e5 100644 --- a/docs/_sources/changelog.md.txt +++ b/docs/_sources/changelog.md.txt @@ -1,5 +1,14 @@ # Changelog +## Version 0.1.15 (2024/01/07) + +No new features, only dependencies update + +### Misc + +* [#49](https://github.com/SamR1/rdltr/issues/49) - upgrade to Vue3 + + ## Version 0.1.14 (2023/06/14) No new features, only dependencies update diff --git a/docs/_static/basic.css b/docs/_static/basic.css index 7577acb..30fee9d 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -670,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -738,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index 42fcaa5..9da1c65 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,5 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.1.14', +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1.15', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css index 08bec68..84ab303 100644 --- a/docs/_static/pygments.css +++ b/docs/_static/pygments.css @@ -17,6 +17,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #008400 } /* Generic.Inserted */ diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js index 97d56a7..7918c3f 100644 --- a/docs/_static/searchtools.js +++ b/docs/_static/searchtools.js @@ -57,12 +57,12 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,20 +75,24 @@ const _displayItem = (item, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) + if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) @@ -97,6 +101,9 @@ const _displayItem = (item, searchTerms) => { listItem.appendChild( Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -115,14 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - searchTerms + searchTerms, + highlightTerms, ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -360,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** diff --git a/docs/_static/sphinx_highlight.js b/docs/_static/sphinx_highlight.js index aae669d..8a96c69 100644 --- a/docs/_static/sphinx_highlight.js +++ b/docs/_static/sphinx_highlight.js @@ -29,14 +29,19 @@ const _highlight = (node, addItems, text, className) => { } span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); parent.insertBefore( span, parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), + rest, node.nextSibling ) ); node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); if (isInSVG) { const rect = document.createElementNS( @@ -140,5 +145,10 @@ const SphinxHighlight = { }, }; -_ready(SphinxHighlight.highlightSearchWords); -_ready(SphinxHighlight.initEscapeListener); +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/changelog.html b/docs/changelog.html index 34b35b0..8535d15 100644 --- a/docs/changelog.html +++ b/docs/changelog.html @@ -1,23 +1,25 @@ - + - + - Changelog — rdltr 0.1.14 + <title>Changelog — rdltr 0.1.15 documentation - - - + + + + + - - - - - + + + + + @@ -36,7 +38,7 @@ rdltr
- 0.1.14 + 0.1.15
@@ -52,6 +54,10 @@
  • Features
  • Installation
  • Changelog