From 614be34081aec1dd760a858981a716ec998e2aa3 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 18 Sep 2021 16:26:28 -0700 Subject: [PATCH 01/36] Document journal types (#1331) * Add docs section for journal types * Include new journal types docs section in site nav * Add section on changing a journal type and clean up work from previous commit --- docs/journal-types.md | 61 +++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 62 insertions(+) create mode 100644 docs/journal-types.md diff --git a/docs/journal-types.md b/docs/journal-types.md new file mode 100644 index 00000000..31806572 --- /dev/null +++ b/docs/journal-types.md @@ -0,0 +1,61 @@ + +# Journal Types +`jrnl` can store your journal in a few different ways: + + - a single text file (encrypted or otherwise) + - a folder structure organized by date containing unencrypted text files + - the DayOne Classic format + +There is no need to specify what type of journal you'd like to use. Instead, +`jrnl` will automatically detect the journal type based on whether you're +referencing a file or a folder in your [config file](advanced.md), +and if it's a folder, whether or not DayOne Classic content exists in it. + +## Single File +The single file format is the most flexible, as it can be [encrypted](encryption.md). +To use it, enter any path that is a file or does not already exist. You can +use any extension. `jrnl` will automatically create the file when you save +your first entry. + +## Folder +The folder journal format organizes your entries into subfolders for the year +and month and `.txt` files for each day. If there are multiple entries in a day, +they all appear in the same `.txt` file. + +The directory tree structure is in this format: `YYYY/MM/DD.txt`. For instance, if +you have an entry on May 5th, 2021 in a folder journal at `~/folderjournal`, it will +be located in: `~/folderjournal/2021/05/05.txt` + +!!! note +When creating a new folder journal, you will need to create the folder before running +`jrnl`. Otherwise, when you run `jrnl` for the first time, it will assume that you +are creating a single file journal instead, and it will create a file at that path. + +!!! note +Folder journals can't be encrypted. + +## Day One Classic +`jrnl` supports the original data format used by DayOne. It's similar to the folder +journal format, except it's identified by either of these characteristics: + +* the folder has a `.dayone` extension +* the folder has a subfolder named `entries` + +This is not to be confused with the DayOne 2.0 format, [which is very different](https://help.dayoneapp.com/en/articles/1187337-day-one-classic-is-retired). + +!!! note +DayOne Classic journals can't be encrypted. + +## Changing your journal type +You can't simply modify a journal's configuration to change its type. Instead, +define a new journal as the type you'd like, and use +[piping](https://en.wikipedia.org/wiki/Redirection_(computing)#Piping) +to export your old journal as `txt` to an import command on your new journal. + +For instance, if you have a `projects` journal you would like to import into +a `new` journal, you would run the following after setting up the configuration +for your `new` journal: +``` +jrnl projects --format txt | jrnl new --import +``` diff --git a/mkdocs.yml b/mkdocs.yml index 65a515da..348f0a83 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,6 +21,7 @@ nav: - Quickstart: installation.md - Basic Usage: usage.md - Encryption: encryption.md + - Journal Types: journal-types.md - Privacy and Security: privacy-and-security.md - Formats: formats.md - Advanced Usage: advanced.md From 9f16cc42f5a833da0035b08c0bbe1fedc3ca1271 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 18 Sep 2021 23:28:00 +0000 Subject: [PATCH 02/36] Update changelog [ci skip] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7c50316..9dca20c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,9 @@ **Documentation:** +- Document folder journal and DayOne journal types [\#1326](https://github.com/jrnl-org/jrnl/issues/1326) - Fix readme splash and add changelog link to readme [\#1339](https://github.com/jrnl-org/jrnl/pull/1339) ([micahellison](https://github.com/micahellison)) +- Document journal types [\#1331](https://github.com/jrnl-org/jrnl/pull/1331) ([micahellison](https://github.com/micahellison)) **Packaging:** From 4c0fb344d1d5f7aac5095eddf619e35649b12fa1 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 25 Sep 2021 11:11:28 -0700 Subject: [PATCH 03/36] Add CACHE_STRING secret to bust GitHub Actions python cache (#1344) * Add CACHE_STRING secret to allow maintainers to bust cache without a commit * Quick change Co-authored-by: Jonathan Wren --- .github/workflows/testing.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index 2976399f..c6cf4c73 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -45,11 +45,11 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: poetry cache + - name: poetry cache # Change CACHE_STRING secret to bust the cache. Useful with minor Python version changes. uses: actions/cache@v2 with: path: .venv - key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ matrix.python-version }}-v2 + key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ matrix.python-version }}-${{ secrets.CACHE_STRING }} - name: Install dependencies if: ${{ matrix.python-version != '3.10-dev' }} From 60c9ed124dd1f894731518c641f4e744d159e0cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Oct 2021 12:23:17 -0700 Subject: [PATCH 04/36] Bump cryptography from 3.4.8 to 35.0.0 (#1345) Bumps [cryptography](https://github.com/pyca/cryptography) from 3.4.8 to 35.0.0. - [Release notes](https://github.com/pyca/cryptography/releases) - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/3.4.8...35.0.0) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 57 +++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/poetry.lock b/poetry.lock index d55ab429..cc5e4e26 100644 --- a/poetry.lock +++ b/poetry.lock @@ -158,7 +158,7 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "cryptography" -version = "3.4.8" +version = "35.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -171,9 +171,9 @@ cffi = ">=1.12" docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "decorator" @@ -209,7 +209,7 @@ python-versions = "*" python-dateutil = ">=2.8.1" [package.extras] -dev = ["twine", "markdown", "flake8"] +dev = ["twine", "markdown", "flake8", "wheel"] [[package]] name = "glob2" @@ -842,14 +842,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "typing-extensions" -version = "3.10.0.0" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "typing-extensions" version = "3.10.0.2" @@ -1029,23 +1021,26 @@ commonmark = [ {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] cryptography = [ - {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"}, - {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"}, - {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"}, - {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"}, - {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"}, + {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, + {file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"}, + {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"}, + {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"}, + {file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"}, + {file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"}, + {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, ] decorator = [ {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, @@ -1057,6 +1052,7 @@ flake8 = [ ] ghp-import = [ {file = "ghp-import-2.0.1.tar.gz", hash = "sha256:753de2eace6e0f7d4edfb3cce5e3c3b98cd52aadb80163303d1d036bda7b4483"}, + {file = "ghp_import-2.0.1-py3-none-any.whl", hash = "sha256:8241a8e9f8dd3c1fafe9696e6e081b57a208ef907e9939c44e7415e407ab40ea"}, ] glob2 = [ {file = "glob2-0.7.tar.gz", hash = "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c"}, @@ -1441,9 +1437,6 @@ typed-ast = [ {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, From 593245f3fda2d4ae38ef4e7714013edaa32eb120 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 2 Oct 2021 19:24:53 +0000 Subject: [PATCH 05/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dca20c8..df5e5d90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ **Packaging:** +- Bump cryptography from 3.4.8 to 35.0.0 [\#1345](https://github.com/jrnl-org/jrnl/pull/1345) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.8b0 to 21.9b0 [\#1343](https://github.com/jrnl-org/jrnl/pull/1343) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump keyring from 23.1.0 to 23.2.1 [\#1342](https://github.com/jrnl-org/jrnl/pull/1342) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump pytest from 6.2.4 to 6.2.5 [\#1334](https://github.com/jrnl-org/jrnl/pull/1334) ([dependabot[bot]](https://github.com/apps/dependabot)) From 7d8823da6df9f89bebd232babb2ef157f86c35cb Mon Sep 17 00:00:00 2001 From: Jonathan Wren Date: Sat, 2 Oct 2021 13:31:21 -0700 Subject: [PATCH 06/36] Move remaining tests from behave to pytest (#1346) * add newer tests to pytest (from behave) * remove 'lib' from gitignore (since we're using it) * fix capitalization in some steps * add 'the editor should not have been called' step * comment out config override step in pytest-bdd since it's not implemented yet * remove test that didn't really test anything * implement some missing steps in pytest-bdd * change comment to match other tests --- .gitignore | 1 - tests/bdd/features/format.feature | 44 ++++++++++++++ tests/bdd/features/override.feature | 91 +++++++++++++++++++++++++++++ tests/bdd/test_features.py | 1 + tests/lib/then_steps.py | 35 +++++++++-- 5 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 tests/bdd/features/override.feature diff --git a/.gitignore b/.gitignore index 374deb4b..41d2df7b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,6 @@ var sdist develop-eggs .installed.cfg -lib lib64 .python-version diff --git a/tests/bdd/features/format.feature b/tests/bdd/features/format.feature index b9e2e384..36a89747 100644 --- a/tests/bdd/features/format.feature +++ b/tests/bdd/features/format.feature @@ -1,5 +1,33 @@ Feature: Custom formats + Scenario Outline: Short printing via --format flag + Given we use the config "" + And we use the password "test" if prompted + When we run "jrnl --format short -3" + Then we should get no error + + Examples: configs + | config_file | + | basic_onefile.yaml | + | basic_encrypted.yaml | + | basic_folder.yaml | + | basic_dayone.yaml | + + + Scenario Outline: Pretty Printing aka the Default + Given we use the config "" + And we use the password "test" if prompted + When we run "jrnl --format pretty -3" + Then we should get no error + + Examples: configs + | config_file | + | basic_onefile.yaml | + | basic_encrypted.yaml | + | basic_folder.yaml | + | basic_dayone.yaml | + + Scenario Outline: JSON format Given we use the config "" And we use the password "test" if prompted @@ -296,6 +324,22 @@ Feature: Custom formats | basic_folder.yaml | | basic_dayone.yaml | + + Scenario Outline: Export fancy with small linewrap + Given we use the config "" + And we use the password "test" if prompted + When we run "jrnl --config-override linewrap 35 --format fancy -3" + Then we should get no error + And the output should be 35 columns wide + + Examples: configs + | config_file | + | basic_onefile.yaml | + | basic_encrypted.yaml | + | basic_folder.yaml | + | basic_dayone.yaml | + + @todo Scenario Outline: Exporting fancy # Needs better emoji support diff --git a/tests/bdd/features/override.feature b/tests/bdd/features/override.feature new file mode 100644 index 00000000..3d9fb27f --- /dev/null +++ b/tests/bdd/features/override.feature @@ -0,0 +1,91 @@ +Feature: Implementing Runtime Overrides for Select Configuration Keys + + Scenario: Override configured editor with built-in input === editor:'' + Given we use the config "basic_encrypted.yaml" + And we use the password "test" if prompted + When we run "jrnl --config-override editor ''" + Then the stdin prompt should have been called + And the editor should not have been called + + + # @todo implement this step in pytest (doesn't currently support overrides) + @skip + Scenario: Postconfig commands with overrides + Given we use the config "basic_encrypted.yaml" + And we use the password "test" if prompted + When we run "jrnl --decrypt --config-override highlight false --config-override editor nano" + Then the config should contain "highlight: false" + Then the editor should not have been called + + + Scenario: Override configured linewrap with a value of 23 + Given we use the config "simple.yaml" + And we use the password "test" if prompted + When we run "jrnl -2 --config-override linewrap 23 --format fancy" + Then the output should be + ┎─────╮2013-06-09 15:39 + ┃ My ╘═══════════════╕ + ┃ fir st ent ry. │ + ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ + ┃ Everything is │ + ┃ alright │ + ┖─────────────────────┘ + ┎─────╮2013-06-10 15:40 + ┃ Lif ╘═══════════════╕ + ┃ e is goo d. │ + ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ + ┃ But I'm better. │ + ┖─────────────────────┘ + + + # @todo implement this step in pytest (doesn't currently support overrides) + @skip + Scenario: Override color selections with runtime overrides + Given we use the config "basic_encrypted.yaml" + And we use the password "test" if prompted + When we run "jrnl -1 --config-override colors.body blue" + Then the config should have "colors.body" set to "blue" + + + # @todo implement this step in pytest (doesn't currently support overrides) + @skip + Scenario: Apply multiple config overrides + Given we use the config "basic_encrypted.yaml" + And we use the password "test" if prompted + When we run "jrnl -1 --config-override colors.body green --config-override editor 'nano'" + Then the config should have "colors.body" set to "green" + And the config should have "editor" set to "nano" + + + Scenario: Override default journal + Given we use the config "basic_dayone.yaml" + And we use the password "test" if prompted + When we run "jrnl --config-override journals.default features/journals/simple.journal 20 Mar 2000: The rain in Spain comes from clouds" + Then we should get no error + And we should see the message "Entry added" + When we run "jrnl -3 --config-override journals.default features/journals/simple.journal" + Then the output should be + 2000-03-20 09:00 The rain in Spain comes from clouds + + 2013-06-09 15:39 My first entry. + | Everything is alright + + 2013-06-10 15:40 Life is good. + | But I'm better. + + + Scenario: Make an entry into an overridden journal + Given we use the config "basic_dayone.yaml" + And we use the password "test" if prompted + When we run "jrnl --config-override journals.temp features/journals/simple.journal temp Sep 06 1969: @say Ni" + Then we should get no error + And we should see the message "Entry added" + When we run "jrnl --config-override journals.temp features/journals/simple.journal temp -3" + Then the output should be + 1969-09-06 09:00 @say Ni + + 2013-06-09 15:39 My first entry. + | Everything is alright + + 2013-06-10 15:40 Life is good. + | But I'm better. diff --git a/tests/bdd/test_features.py b/tests/bdd/test_features.py index b824df39..1509e92d 100644 --- a/tests/bdd/test_features.py +++ b/tests/bdd/test_features.py @@ -9,6 +9,7 @@ scenarios("features/file_storage.feature") scenarios("features/format.feature") scenarios("features/import.feature") scenarios("features/multiple_journals.feature") +scenarios("features/override.feature") scenarios("features/password.feature") scenarios("features/search.feature") scenarios("features/star.feature") diff --git a/tests/lib/then_steps.py b/tests/lib/then_steps.py index b56c203f..2dadf82e 100644 --- a/tests/lib/then_steps.py +++ b/tests/lib/then_steps.py @@ -84,6 +84,14 @@ def output_should_contain_version(cli_run, toml_version): assert toml_version in out, toml_version +@then(parse("the output should be {width:d} columns wide")) +def output_should_be_columns_wide(cli_run, width): + out = cli_run["stdout"] + out_lines = out.splitlines() + for line in out_lines: + assert len(line) <= width + + @then(parse('we should see the message "{text}"')) def should_see_the_message(text, cli_run): out = cli_run["stderr"] @@ -301,15 +309,34 @@ def count_elements(number, item, cli_run): assert len(xml_tree.findall(".//" + item)) == number -@then(parse("the editor should have been called")) -@then(parse("the editor should have been called with {num_args} arguments")) -def count_editor_args(num_args, cli_run, editor_state): - assert cli_run["mocks"]["editor"].called +@then(parse("the editor {should_or_should_not} have been called")) +@then( + parse( + "the editor {should_or_should_not} have been called with {num_args} arguments" + ) +) +def count_editor_args(num_args, cli_run, editor_state, should_or_should_not): + we_should = parse_should_or_should_not(should_or_should_not) + + if we_should: + assert cli_run["mocks"]["editor"].called + else: + assert not cli_run["mocks"]["editor"].called if isinstance(num_args, int): assert len(editor_state["command"]) == int(num_args) +@then(parse("the stdin prompt {should_or_should_not} have been called")) +def stdin_prompt_called(cli_run, should_or_should_not): + we_should = parse_should_or_should_not(should_or_should_not) + + if we_should: + assert cli_run["mocks"]["stdin"].called + else: + assert not cli_run["mocks"]["stdin"].called + + @then(parse('the editor filename should end with "{suffix}"')) def editor_filename_suffix(suffix, editor_state): editor_filename = editor_state["tmpfile"]["name"] From 1196b05ff63a155858d8018cc06c6300c874f236 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 11:43:43 -0700 Subject: [PATCH 07/36] Bump pytz from 2021.1 to 2021.3 (#1348) Bumps [pytz](https://github.com/stub42/pytz) from 2021.1 to 2021.3. - [Release notes](https://github.com/stub42/pytz/releases) - [Commits](https://github.com/stub42/pytz/compare/release_2021.1...release_2021.3) --- updated-dependencies: - dependency-name: pytz dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index cc5e4e26..e718ea5a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -710,7 +710,7 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2021.1" +version = "2021.3" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -1271,8 +1271,8 @@ python-dateutil = [ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, From a98f3f78afc1e51fff92c3c25d3b033e4bd1f8b6 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 9 Oct 2021 18:45:22 +0000 Subject: [PATCH 08/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index df5e5d90..c47711d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ **Packaging:** +- Bump pytz from 2021.1 to 2021.3 [\#1348](https://github.com/jrnl-org/jrnl/pull/1348) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump cryptography from 3.4.8 to 35.0.0 [\#1345](https://github.com/jrnl-org/jrnl/pull/1345) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.8b0 to 21.9b0 [\#1343](https://github.com/jrnl-org/jrnl/pull/1343) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump keyring from 23.1.0 to 23.2.1 [\#1342](https://github.com/jrnl-org/jrnl/pull/1342) ([dependabot[bot]](https://github.com/apps/dependabot)) From 44edb9bdee0f0bcd7f8000039c3eeeb3850e9718 Mon Sep 17 00:00:00 2001 From: Jonathan Wren Date: Sat, 9 Oct 2021 12:10:08 -0700 Subject: [PATCH 09/36] Add more steps to `pytest`, fully remove `behave` (#1347) * update yaml loader to new method * Add config overrides steps to pytest This requires some patching around the config object, which now happens in every test. Co-authored-by: Micah Jerome Ellison * udpate docs for new tests * remove behave from deps * remove feature dir from flake8 checks * udpate lock file * disable pip version check (it keeps spamming the pipeline) Co-authored-by: Micah Jerome Ellison --- .github/workflows/testing.yaml | 10 +- CONTRIBUTING.md | 4 +- Makefile | 2 +- features/build.feature | 8 - features/core.feature | 21 - features/data/configs/basic_dayone.yaml | 17 - features/data/configs/basic_encrypted.yaml | 17 - features/data/configs/basic_folder.yaml | 17 - features/data/configs/basic_onefile.yaml | 17 - features/data/configs/brackets.yaml | 12 - features/data/configs/bug153.yaml | 17 - features/data/configs/bug343.yaml | 13 - features/data/configs/bug780.yaml | 12 - features/data/configs/dayone.yaml | 12 - features/data/configs/dayone_empty.yaml | 17 - features/data/configs/deletion.yaml | 12 - features/data/configs/deletion_filters.yaml | 12 - features/data/configs/editor-args.yaml | 12 - features/data/configs/editor.yaml | 12 - .../data/configs/editor_empty_folder.yaml | 12 - features/data/configs/editor_encrypted.yaml | 17 - .../configs/editor_markdown_extension.yaml | 18 - features/data/configs/empty_folder.yaml | 12 - features/data/configs/encrypted.yaml | 12 - features/data/configs/encrypted_old.json | 13 - features/data/configs/encrypted_old.yaml | 11 - features/data/configs/format_md.yaml | 19 - features/data/configs/format_text.yaml | 19 - features/data/configs/invalid_color.yaml | 17 - .../data/configs/little_endian_dates.yaml | 12 - .../data/configs/markdown-headings-335.yaml | 17 - features/data/configs/missing_directory.yaml | 17 - features/data/configs/missing_journal.yaml | 17 - .../data/configs/mostlyreadabledates.yaml | 12 - features/data/configs/multiline-tags.yaml | 17 - features/data/configs/multiline.yaml | 17 - features/data/configs/multiple.yaml | 18 - features/data/configs/no_colors.yaml | 12 - features/data/configs/simple.yaml | 17 - features/data/configs/tags-216.yaml | 17 - features/data/configs/tags-237.yaml | 17 - features/data/configs/tags.yaml | 17 - features/data/configs/unreadabledates.yaml | 17 - features/data/configs/upgrade_from_195.json | 11 - .../upgrade_from_195_little_endian_dates.json | 11 - ...om_195_with_missing_encrypted_journal.json | 11 - ...upgrade_from_195_with_missing_journal.json | 11 - .../D04D335AFED711EABA18FAFFC2100C3D.doentry | 53 -- .../FC8A86CAFED711EA8892FAFFC2100C3D.doentry | 55 -- .../FD8ABC8EFED711EABC35FAFFC2100C3D.doentry | 44 -- .../data/journals/basic_encrypted.journal | 1 - .../data/journals/basic_folder/2020/08/29.txt | 19 - .../data/journals/basic_folder/2020/08/31.txt | 23 - .../data/journals/basic_folder/2020/09/24.txt | 11 - features/data/journals/basic_onefile.journal | 58 -- features/data/journals/brackets.journal | 2 - .../B40EE704E15846DE8D45C44118A4D511.doentry | 56 -- .../B40EE704E15846DE8D45C44118A4D512.doentry | 52 -- .../48A25033B34047C591160A4480197D8B.doentry | 33 - .../044F3747A38546168B572C2E3F217FA2.doentry | 34 - .../0BDDD6CDA43C4A9AA2681517CC35AD9D.doentry | 46 -- .../422BC895507944A291E6FC44FC6B8BFC.doentry | 31 - .../4BB1F46946AD439996C9B59DE7C4DDC1.doentry | 29 - .../dayone_empty.dayone/entries/empty.txt | 1 - features/data/journals/deletion.journal | 5 - .../data/journals/deletion_filters.journal | 14 - features/data/journals/empty_folder/empty | 1 - features/data/journals/encrypted.journal | 1 - .../journals/encrypted_jrnl-1-9-5.journal | Bin 128 -> 0 bytes .../data/journals/little_endian_dates.journal | 5 - .../journals/markdown-headings-335.journal | 42 -- .../data/journals/mostlyreadabledates.journal | 8 - features/data/journals/multiline-tags.journal | 7 - features/data/journals/multiline.journal | 5 - features/data/journals/simple.journal | 5 - .../data/journals/simple_jrnl-1-9-5.journal | 13 - ...ple_jrnl-1-9-5_little_endian_dates.journal | 13 - features/data/journals/tags-216.journal | 2 - features/data/journals/tags-237.journal | 3 - features/data/journals/tags.journal | 8 - .../data/journals/unreadabledates.journal | 5 - features/data/journals/work.journal | 0 features/data/templates/extension.md | 0 features/data/templates/sample.template | 19 - features/datetime.feature | 155 ---- features/delete.feature | 229 ------ features/encrypt.feature | 35 - features/environment.py | 86 --- features/file_storage.feature | 56 -- features/format.feature | 621 ---------------- features/import.feature | 93 --- features/multiple_journals.feature | 65 -- features/overrides.feature | 98 --- features/password.feature | 116 --- features/search.feature | 318 -------- features/star.feature | 35 - features/steps/core.py | 687 ------------------ features/steps/export_steps.py | 200 ----- features/steps/override.py | 77 -- features/tag.feature | 53 -- features/upgrade.feature | 71 -- features/write.feature | 216 ------ jrnl/jrnl.py | 4 +- jrnl/override.py | 7 +- poetry.lock | 318 +++----- pyproject.toml | 4 +- tests/bdd/features/override.feature | 19 +- tests/lib/fixtures.py | 7 +- tests/lib/helpers.py | 11 + tests/lib/then_steps.py | 54 +- tests/lib/when_steps.py | 13 + tests/unit/test_override.py | 64 +- 112 files changed, 264 insertions(+), 4814 deletions(-) delete mode 100644 features/build.feature delete mode 100644 features/core.feature delete mode 100644 features/data/configs/basic_dayone.yaml delete mode 100644 features/data/configs/basic_encrypted.yaml delete mode 100644 features/data/configs/basic_folder.yaml delete mode 100644 features/data/configs/basic_onefile.yaml delete mode 100644 features/data/configs/brackets.yaml delete mode 100644 features/data/configs/bug153.yaml delete mode 100644 features/data/configs/bug343.yaml delete mode 100644 features/data/configs/bug780.yaml delete mode 100644 features/data/configs/dayone.yaml delete mode 100644 features/data/configs/dayone_empty.yaml delete mode 100644 features/data/configs/deletion.yaml delete mode 100644 features/data/configs/deletion_filters.yaml delete mode 100644 features/data/configs/editor-args.yaml delete mode 100644 features/data/configs/editor.yaml delete mode 100644 features/data/configs/editor_empty_folder.yaml delete mode 100644 features/data/configs/editor_encrypted.yaml delete mode 100644 features/data/configs/editor_markdown_extension.yaml delete mode 100644 features/data/configs/empty_folder.yaml delete mode 100644 features/data/configs/encrypted.yaml delete mode 100644 features/data/configs/encrypted_old.json delete mode 100644 features/data/configs/encrypted_old.yaml delete mode 100644 features/data/configs/format_md.yaml delete mode 100644 features/data/configs/format_text.yaml delete mode 100644 features/data/configs/invalid_color.yaml delete mode 100644 features/data/configs/little_endian_dates.yaml delete mode 100644 features/data/configs/markdown-headings-335.yaml delete mode 100644 features/data/configs/missing_directory.yaml delete mode 100644 features/data/configs/missing_journal.yaml delete mode 100644 features/data/configs/mostlyreadabledates.yaml delete mode 100644 features/data/configs/multiline-tags.yaml delete mode 100644 features/data/configs/multiline.yaml delete mode 100644 features/data/configs/multiple.yaml delete mode 100644 features/data/configs/no_colors.yaml delete mode 100644 features/data/configs/simple.yaml delete mode 100644 features/data/configs/tags-216.yaml delete mode 100644 features/data/configs/tags-237.yaml delete mode 100644 features/data/configs/tags.yaml delete mode 100644 features/data/configs/unreadabledates.yaml delete mode 100644 features/data/configs/upgrade_from_195.json delete mode 100644 features/data/configs/upgrade_from_195_little_endian_dates.json delete mode 100644 features/data/configs/upgrade_from_195_with_missing_encrypted_journal.json delete mode 100644 features/data/configs/upgrade_from_195_with_missing_journal.json delete mode 100644 features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry delete mode 100644 features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry delete mode 100644 features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry delete mode 100644 features/data/journals/basic_encrypted.journal delete mode 100644 features/data/journals/basic_folder/2020/08/29.txt delete mode 100644 features/data/journals/basic_folder/2020/08/31.txt delete mode 100644 features/data/journals/basic_folder/2020/09/24.txt delete mode 100644 features/data/journals/basic_onefile.journal delete mode 100644 features/data/journals/brackets.journal delete mode 100644 features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D511.doentry delete mode 100644 features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D512.doentry delete mode 100644 features/data/journals/bug780.dayone/entries/48A25033B34047C591160A4480197D8B.doentry delete mode 100644 features/data/journals/dayone.dayone/entries/044F3747A38546168B572C2E3F217FA2.doentry delete mode 100644 features/data/journals/dayone.dayone/entries/0BDDD6CDA43C4A9AA2681517CC35AD9D.doentry delete mode 100644 features/data/journals/dayone.dayone/entries/422BC895507944A291E6FC44FC6B8BFC.doentry delete mode 100644 features/data/journals/dayone.dayone/entries/4BB1F46946AD439996C9B59DE7C4DDC1.doentry delete mode 100644 features/data/journals/dayone_empty.dayone/entries/empty.txt delete mode 100644 features/data/journals/deletion.journal delete mode 100644 features/data/journals/deletion_filters.journal delete mode 100644 features/data/journals/empty_folder/empty delete mode 100644 features/data/journals/encrypted.journal delete mode 100644 features/data/journals/encrypted_jrnl-1-9-5.journal delete mode 100644 features/data/journals/little_endian_dates.journal delete mode 100644 features/data/journals/markdown-headings-335.journal delete mode 100644 features/data/journals/mostlyreadabledates.journal delete mode 100644 features/data/journals/multiline-tags.journal delete mode 100644 features/data/journals/multiline.journal delete mode 100644 features/data/journals/simple.journal delete mode 100644 features/data/journals/simple_jrnl-1-9-5.journal delete mode 100644 features/data/journals/simple_jrnl-1-9-5_little_endian_dates.journal delete mode 100644 features/data/journals/tags-216.journal delete mode 100644 features/data/journals/tags-237.journal delete mode 100644 features/data/journals/tags.journal delete mode 100644 features/data/journals/unreadabledates.journal delete mode 100644 features/data/journals/work.journal delete mode 100644 features/data/templates/extension.md delete mode 100644 features/data/templates/sample.template delete mode 100644 features/datetime.feature delete mode 100644 features/delete.feature delete mode 100644 features/encrypt.feature delete mode 100644 features/environment.py delete mode 100644 features/file_storage.feature delete mode 100644 features/format.feature delete mode 100644 features/import.feature delete mode 100644 features/multiple_journals.feature delete mode 100644 features/overrides.feature delete mode 100644 features/password.feature delete mode 100644 features/search.feature delete mode 100644 features/star.feature delete mode 100644 features/steps/core.py delete mode 100644 features/steps/export_steps.py delete mode 100644 features/steps/override.py delete mode 100644 features/tag.feature delete mode 100644 features/upgrade.feature delete mode 100644 features/write.feature diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index c6cf4c73..ba999fbe 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -55,7 +55,7 @@ jobs: if: ${{ matrix.python-version != '3.10-dev' }} run: | echo '::group::poetry' - pip install poetry + pip --disable-pip-version-check install poetry poetry config --local virtualenvs.in-project true echo '::endgroup::' @@ -70,7 +70,7 @@ jobs: if: ${{ matrix.python-version == '3.10-dev' }} run: | echo '::group::poetry' - pip install poetry==1.2.0a2 + pip --disable-pip-version-check install poetry==1.2.0a2 poetry config --local virtualenvs.in-project true echo '::endgroup::' @@ -90,12 +90,8 @@ jobs: if: ${{ matrix.python-version != '3.10-dev' && env.DEPS_INSTALLED == 'true' }} run: | poetry run pflake8 --version - poetry run pflake8 jrnl features tests + poetry run pflake8 jrnl tests - name: Test with pytest if: ${{ env.DEPS_INSTALLED == 'true' }} run: poetry run pytest --junitxml=reports/pytest/results.xml - - - name: Test with behave - if: ${{ env.DEPS_INSTALLED == 'true' }} - run: poetry run behave --no-skipped --format progress2 --junit --junit-directory reports/behave diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f5e691a..cf9c4f36 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -96,9 +96,9 @@ A typical development workflow includes: When resolving bugs or adding new functionality, please add tests to prevent that functionality from breaking in the future. If you notice any functionality that isn't covered in the tests, feel free to submit a test-only pull request as well. -For integration testing, jrnl uses [behave](https://behave.readthedocs.io/) tests, which are all in the `features` folder. +For testing, jrnl uses [pytest](https://docs.pytest.org) for unit tests, and [pytest-bdd](https://pytest-bdd.readthedocs.io/) for integration testing. All tests are in the `tests` folder. -Many tests can be created by only editing `feature` files with the same format as other tests. For more complicated functionality, you may need to implement steps in `features/steps` which are then executed by your tests in the `feature` files. +Many tests can be created by only editing `*.feature` files with the same format as other tests. For more complicated functionality, you may need to implement steps in `tests/lib/` which are then executed by your tests in the `feature` files. Starting in 2020, jrnl is also using [pytest](https://docs.pytest.org/) for unit tests. These tests are in the `tests` folder. diff --git a/Makefile b/Makefile index b2e27f32..a9833c3e 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ bdd: # bdd tests bdd-debug: # bdd tests poetry run pytest tests/bdd --gherkin-terminal-reporter --tb=native -x -vv -test: lint unit bdd ## Run unit tests and behave tests +test: lint unit bdd build: poetry build diff --git a/features/build.feature b/features/build.feature deleted file mode 100644 index 4725ea85..00000000 --- a/features/build.feature +++ /dev/null @@ -1,8 +0,0 @@ -Feature: Build process - - @deployment_tests - Scenario: Version numbers should stay in sync - Given we use the config "simple.yaml" - When we run "jrnl --version" - Then we should get no error - And the output should contain pyproject.toml version diff --git a/features/core.feature b/features/core.feature deleted file mode 100644 index 26640c00..00000000 --- a/features/core.feature +++ /dev/null @@ -1,21 +0,0 @@ -Feature: Functionality of jrnl outside of actually handling journals - - Scenario: Displaying the version number - Given we use the config "simple.yaml" - When we run "jrnl --version" - Then we should get no error - Then the output should match "^jrnl version v\d+\.\d+(\.\d+)?(-(alpha|beta)\d*)?" - - Scenario: Displaying the version number - Given we use the config "simple.yaml" - When we run "jrnl -v" - Then we should get no error - Then the output should match "^jrnl version v\d+\.\d+(\.\d+)?(-(alpha|beta)\d*)?" - - Scenario: Running the diagnostic command - When we run "jrnl --diagnostic" - Then the output should contain "jrnl" - And the output should contain "Python" - - @todo - Scenario: Listing available journals diff --git a/features/data/configs/basic_dayone.yaml b/features/data/configs/basic_dayone.yaml deleted file mode 100644 index 0209f2f7..00000000 --- a/features/data/configs/basic_dayone.yaml +++ /dev/null @@ -1,17 +0,0 @@ -colors: - date: none - title: none - body: none - tags: none -default_hour: 9 -default_minute: 0 -editor: noop -encrypt: false -highlight: true -journals: - default: features/journals/basic_dayone.dayone -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/basic_encrypted.yaml b/features/data/configs/basic_encrypted.yaml deleted file mode 100644 index 77f4e48d..00000000 --- a/features/data/configs/basic_encrypted.yaml +++ /dev/null @@ -1,17 +0,0 @@ -colors: - date: none - title: none - body: none - tags: none -default_hour: 9 -default_minute: 0 -editor: noop -encrypt: true -highlight: true -journals: - default: features/journals/basic_encrypted.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/basic_folder.yaml b/features/data/configs/basic_folder.yaml deleted file mode 100644 index ba0de638..00000000 --- a/features/data/configs/basic_folder.yaml +++ /dev/null @@ -1,17 +0,0 @@ -colors: - date: none - title: none - body: none - tags: none -default_hour: 9 -default_minute: 0 -editor: noop -encrypt: false -highlight: true -journals: - default: features/journals/basic_folder -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/basic_onefile.yaml b/features/data/configs/basic_onefile.yaml deleted file mode 100644 index fb48c6f8..00000000 --- a/features/data/configs/basic_onefile.yaml +++ /dev/null @@ -1,17 +0,0 @@ -colors: - date: none - title: none - body: none - tags: none -default_hour: 9 -default_minute: 0 -editor: noop -encrypt: false -highlight: true -journals: - default: features/journals/basic_onefile.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/brackets.yaml b/features/data/configs/brackets.yaml deleted file mode 100644 index e658947c..00000000 --- a/features/data/configs/brackets.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/brackets.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/bug153.yaml b/features/data/configs/bug153.yaml deleted file mode 100644 index ff645ab6..00000000 --- a/features/data/configs/bug153.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -journals: - default: features/journals/bug153.dayone -linewrap: 80 -tagsymbols: '@' -template: false -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/bug343.yaml b/features/data/configs/bug343.yaml deleted file mode 100644 index a4e25d8a..00000000 --- a/features/data/configs/bug343.yaml +++ /dev/null @@ -1,13 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -template: false -encrypt: false -highlight: true -journals: - simple: features/journals/simple.journal - work: features/journals/work.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/bug780.yaml b/features/data/configs/bug780.yaml deleted file mode 100644 index e1d830c2..00000000 --- a/features/data/configs/bug780.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -journals: - default: features/journals/bug780.dayone -linewrap: 80 -tagsymbols: '@' -template: false -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/dayone.yaml b/features/data/configs/dayone.yaml deleted file mode 100644 index 894cb911..00000000 --- a/features/data/configs/dayone.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: noop -template: false -encrypt: false -highlight: true -journals: - default: features/journals/dayone.dayone -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/dayone_empty.yaml b/features/data/configs/dayone_empty.yaml deleted file mode 100644 index 7750d389..00000000 --- a/features/data/configs/dayone_empty.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: noop -template: false -encrypt: false -highlight: true -journals: - default: features/journals/dayone_empty.dayone -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/deletion.yaml b/features/data/configs/deletion.yaml deleted file mode 100644 index d4155260..00000000 --- a/features/data/configs/deletion.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/deletion.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/deletion_filters.yaml b/features/data/configs/deletion_filters.yaml deleted file mode 100644 index 73a88e4d..00000000 --- a/features/data/configs/deletion_filters.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/deletion_filters.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/editor-args.yaml b/features/data/configs/editor-args.yaml deleted file mode 100644 index 12c5bd9c..00000000 --- a/features/data/configs/editor-args.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: vim -f -c 'setf markdown' -encrypt: false -highlight: true -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/editor.yaml b/features/data/configs/editor.yaml deleted file mode 100644 index 8a06f916..00000000 --- a/features/data/configs/editor.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "vim" -encrypt: false -highlight: true -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/editor_empty_folder.yaml b/features/data/configs/editor_empty_folder.yaml deleted file mode 100644 index 1724bbfb..00000000 --- a/features/data/configs/editor_empty_folder.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: 'vim' -template: false -encrypt: false -highlight: true -journals: - default: features/journals/empty_folder -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/editor_encrypted.yaml b/features/data/configs/editor_encrypted.yaml deleted file mode 100644 index 75273c96..00000000 --- a/features/data/configs/editor_encrypted.yaml +++ /dev/null @@ -1,17 +0,0 @@ -colors: - body: green - date: blue - tags: none - title: yellow -default_hour: 9 -default_minute: 0 -editor: "vim" -encrypt: true -template: false -highlight: true -journals: - default: features/journals/encrypted.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/editor_markdown_extension.yaml b/features/data/configs/editor_markdown_extension.yaml deleted file mode 100644 index bf3b8d8e..00000000 --- a/features/data/configs/editor_markdown_extension.yaml +++ /dev/null @@ -1,18 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -editor: "vim" -journals: - default: features/journals/editor_markdown_extension.journal -linewrap: 80 -tagsymbols: "@" -template: features/templates/extension.md -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/empty_folder.yaml b/features/data/configs/empty_folder.yaml deleted file mode 100644 index 52a21854..00000000 --- a/features/data/configs/empty_folder.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -template: false -encrypt: false -highlight: true -journals: - default: features/journals/empty_folder -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/encrypted.yaml b/features/data/configs/encrypted.yaml deleted file mode 100644 index 4d50b607..00000000 --- a/features/data/configs/encrypted.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: true -template: false -highlight: true -journals: - default: features/journals/encrypted.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/encrypted_old.json b/features/data/configs/encrypted_old.json deleted file mode 100644 index e69d9b79..00000000 --- a/features/data/configs/encrypted_old.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "default_hour": 9, - "default_minute": 0, - "editor": "", - "encrypt": true, - "highlight": true, - "journals": { - "default": "features/journals/encrypted_jrnl-1-9-5.journal" - }, - "linewrap": 80, - "tagsymbols": "@", - "timeformat": "%Y-%m-%d %H:%M" -} diff --git a/features/data/configs/encrypted_old.yaml b/features/data/configs/encrypted_old.yaml deleted file mode 100644 index bc7b1440..00000000 --- a/features/data/configs/encrypted_old.yaml +++ /dev/null @@ -1,11 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: true -highlight: true -journals: - default: features/journals/encrypted_jrnl1-9-5.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/format_md.yaml b/features/data/configs/format_md.yaml deleted file mode 100644 index 0b9f1c3b..00000000 --- a/features/data/configs/format_md.yaml +++ /dev/null @@ -1,19 +0,0 @@ -colors: - body: none - date: none - tags: none - title: none -default_hour: 9 -default_minute: 0 -display_format: markdown -editor: '' -encrypt: false -highlight: true -indent_character: '|' -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: '@' -template: false -timeformat: '%Y-%m-%d %H:%M' -version: v2.4.5 diff --git a/features/data/configs/format_text.yaml b/features/data/configs/format_text.yaml deleted file mode 100644 index c82ff7a7..00000000 --- a/features/data/configs/format_text.yaml +++ /dev/null @@ -1,19 +0,0 @@ -colors: - body: none - date: none - tags: none - title: none -default_hour: 9 -default_minute: 0 -display_format: text -editor: '' -encrypt: false -highlight: true -indent_character: '|' -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: '@' -template: false -timeformat: '%Y-%m-%d %H:%M' -version: v2.4.5 diff --git a/features/data/configs/invalid_color.yaml b/features/data/configs/invalid_color.yaml deleted file mode 100644 index 25c0e58d..00000000 --- a/features/data/configs/invalid_color.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: not-a-color - title: also-not-a-color - body: still-no-color - tags: me-too diff --git a/features/data/configs/little_endian_dates.yaml b/features/data/configs/little_endian_dates.yaml deleted file mode 100644 index 223c820d..00000000 --- a/features/data/configs/little_endian_dates.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/little_endian_dates.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%d.%m.%Y %H:%M" -indent_character: "|" diff --git a/features/data/configs/markdown-headings-335.yaml b/features/data/configs/markdown-headings-335.yaml deleted file mode 100644 index 4368f641..00000000 --- a/features/data/configs/markdown-headings-335.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -template: false -journals: - default: features/journals/markdown-headings-335.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/missing_directory.yaml b/features/data/configs/missing_directory.yaml deleted file mode 100644 index d600404c..00000000 --- a/features/data/configs/missing_directory.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/missing_directory/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/missing_journal.yaml b/features/data/configs/missing_journal.yaml deleted file mode 100644 index a1f6f8cf..00000000 --- a/features/data/configs/missing_journal.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/missing.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/mostlyreadabledates.yaml b/features/data/configs/mostlyreadabledates.yaml deleted file mode 100644 index 5e3e1a15..00000000 --- a/features/data/configs/mostlyreadabledates.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/mostlyreadabledates.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/multiline-tags.yaml b/features/data/configs/multiline-tags.yaml deleted file mode 100644 index 033aaa27..00000000 --- a/features/data/configs/multiline-tags.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/multiline-tags.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/multiline.yaml b/features/data/configs/multiline.yaml deleted file mode 100644 index aa35b3f5..00000000 --- a/features/data/configs/multiline.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/multiline.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/multiple.yaml b/features/data/configs/multiple.yaml deleted file mode 100644 index 65f2c256..00000000 --- a/features/data/configs/multiple.yaml +++ /dev/null @@ -1,18 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -template: false -journals: - default: features/journals/simple.journal - ideas: features/journals/nothing.journal - simple: features/journals/simple.journal - work: features/journals/work.journal - new_encrypted: - encrypt: true - journal: features/journals/new_encrypted.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" diff --git a/features/data/configs/no_colors.yaml b/features/data/configs/no_colors.yaml deleted file mode 100644 index 9111b561..00000000 --- a/features/data/configs/no_colors.yaml +++ /dev/null @@ -1,12 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" diff --git a/features/data/configs/simple.yaml b/features/data/configs/simple.yaml deleted file mode 100644 index 020bab18..00000000 --- a/features/data/configs/simple.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/tags-216.yaml b/features/data/configs/tags-216.yaml deleted file mode 100644 index 81b3865f..00000000 --- a/features/data/configs/tags-216.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -template: false -journals: - default: features/journals/tags-216.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/tags-237.yaml b/features/data/configs/tags-237.yaml deleted file mode 100644 index 5aecd61e..00000000 --- a/features/data/configs/tags-237.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -template: false -journals: - default: features/journals/tags-237.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/tags.yaml b/features/data/configs/tags.yaml deleted file mode 100644 index 4b55952c..00000000 --- a/features/data/configs/tags.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: '' -encrypt: false -highlight: true -template: false -journals: - default: features/journals/tags.journal -linewrap: 80 -tagsymbols: '@' -timeformat: '%Y-%m-%d %H:%M' -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/unreadabledates.yaml b/features/data/configs/unreadabledates.yaml deleted file mode 100644 index 99304e5a..00000000 --- a/features/data/configs/unreadabledates.yaml +++ /dev/null @@ -1,17 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "" -encrypt: false -highlight: true -journals: - default: features/journals/unreadabledates.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - date: none - title: none - body: none - tags: none diff --git a/features/data/configs/upgrade_from_195.json b/features/data/configs/upgrade_from_195.json deleted file mode 100644 index ec380372..00000000 --- a/features/data/configs/upgrade_from_195.json +++ /dev/null @@ -1,11 +0,0 @@ -{ -"default_hour": 9, -"timeformat": "%Y-%m-%d %H:%M", -"linewrap": 80, -"encrypt": false, -"editor": "", -"default_minute": 0, -"highlight": true, -"journals": {"default": "features/journals/simple_jrnl-1-9-5.journal"}, -"tagsymbols": "@" -} diff --git a/features/data/configs/upgrade_from_195_little_endian_dates.json b/features/data/configs/upgrade_from_195_little_endian_dates.json deleted file mode 100644 index 7d3c470c..00000000 --- a/features/data/configs/upgrade_from_195_little_endian_dates.json +++ /dev/null @@ -1,11 +0,0 @@ -{ -"default_hour": 9, -"timeformat": "%d.%m.%Y %H:%M", -"linewrap": 80, -"encrypt": false, -"editor": "", -"default_minute": 0, -"highlight": true, -"journals": {"default": "features/journals/simple_jrnl-1-9-5_little_endian_dates.journal"}, -"tagsymbols": "@" -} diff --git a/features/data/configs/upgrade_from_195_with_missing_encrypted_journal.json b/features/data/configs/upgrade_from_195_with_missing_encrypted_journal.json deleted file mode 100644 index 5bbfb5b1..00000000 --- a/features/data/configs/upgrade_from_195_with_missing_encrypted_journal.json +++ /dev/null @@ -1,11 +0,0 @@ -{ -"default_hour": 9, -"timeformat": "%Y-%m-%d %H:%M", -"linewrap": 80, -"encrypt": true, -"editor": "", -"default_minute": 0, -"highlight": true, -"journals": {"default": "features/journals/encrypted_jrnl-1-9-5.journal", "missing": "features/journals/missing.journal"}, -"tagsymbols": "@" -} diff --git a/features/data/configs/upgrade_from_195_with_missing_journal.json b/features/data/configs/upgrade_from_195_with_missing_journal.json deleted file mode 100644 index 8d456159..00000000 --- a/features/data/configs/upgrade_from_195_with_missing_journal.json +++ /dev/null @@ -1,11 +0,0 @@ -{ -"default_hour": 9, -"timeformat": "%Y-%m-%d %H:%M", -"linewrap": 80, -"encrypt": false, -"editor": "", -"default_minute": 0, -"highlight": true, -"journals": {"default": "features/journals/simple_jrnl-1-9-5.journal", "missing": "features/journals/missing.journal"}, -"tagsymbols": "@" -} diff --git a/features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry b/features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry deleted file mode 100644 index 9721dd55..00000000 --- a/features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Creation Date - 2020-08-29T18:11:00Z - Starred - - Entry Text - Entry the first. -Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada -quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque -augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu -consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In -commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget -venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo. - -Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo -ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse -potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget -molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus -hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis -feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum -urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim. -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget -velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac -porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per -conubia nostra, per inceptos himenaeos. - Time Zone - America/Los_Angeles - UUID - D04D335AFED711EABA18FAFFC2100C3D - Tags - - ipsum - tagone - tagtwo - - Creator - - Device Agent - - Generation Date - 2020-09-25T02:35:45Z - Host Name - iris.lan - OS Agent - Darwin/19.3.0 - Software Agent - jrnl/v2.4.5 - - - diff --git a/features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry b/features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry deleted file mode 100644 index 8c2f3c52..00000000 --- a/features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Creation Date - 2020-08-31T21:32:00Z - Starred - - Entry Text - A second entry in what I hope to be a long series. -Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis leo -vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit amet, -consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl lorem, -vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum lectus, -eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium id -lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu, -egestas at efficitur et, ultrices vel est. Sed commodo et nibh non elementum. -Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome. - -Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel -vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum et -malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis sem, -non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel -ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a commodo -eros. - -Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non -tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor. -Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum -quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum -interdum. Integer id justo dui. Integer eu tellus in turpis bibendum blandit. -Quisque auctor lacinia consectetur. - Time Zone - America/Los_Angeles - UUID - FC8A86CAFED711EA8892FAFFC2100C3D - Tags - - tagtwo - - Creator - - Device Agent - - Generation Date - 2020-09-25T02:36:59Z - Host Name - iris.lan - OS Agent - Darwin/19.3.0 - Software Agent - jrnl/v2.4.5 - - - diff --git a/features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry b/features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry deleted file mode 100644 index d998c36b..00000000 --- a/features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Creation Date - 2020-09-24T16:14:00Z - Starred - - Entry Text - The third entry finally after weeks without writing. -I'm so excited about emojis. 💯 🎶 💩 - -Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis. -Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla -eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis -dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada. -Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis -vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo. -Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at -ante eget fringilla. @tagthree and also @tagone - Time Zone - America/Los_Angeles - UUID - FD8ABC8EFED711EABC35FAFFC2100C3D - Tags - - tagthree - tagone - - Creator - - Device Agent - - Generation Date - 2020-09-25T02:37:01Z - Host Name - iris.lan - OS Agent - Darwin/19.3.0 - Software Agent - jrnl/v2.4.5 - - - diff --git a/features/data/journals/basic_encrypted.journal b/features/data/journals/basic_encrypted.journal deleted file mode 100644 index ffc122df..00000000 --- a/features/data/journals/basic_encrypted.journal +++ /dev/null @@ -1 +0,0 @@ -gAAAAABfb4gQBMqqGn_W8v_s7qCi14bX7inuCOKbsBqIUf7_ch14vTUp7lrysPFvhBp5vGijTwDIbk4LKoIISj8NwM31I8L0zEbMx9y6iyF_zseGGNxBvNN0wzAXa67bs-ohiQhhebcdIc_52sltxL2ELh8JAKUaXRwyapgnMgJ7z6deJppLK-B7RE7BiT0eKjWTDMd2x6cZDswvHs9opDp5yjuKWV5m7x6ggCKYgHT3savT9Tg7V0Fq6K3LGWaE59lCrqlAB0u6dnrDX3qcF4SKyckaniXzRShZGebdkUKDcLFun2V2syZwYQN772xjznIsJ16iXicox2uYKg8CnTefsyCwaOZyBvySGEy3CrlBiuIRIcxCtjKbYJ2B-Aq7LZitnBR7Ny_6_Wm8HsBf3N-cFCp4GShiCKrxuXKcOZ7vszG5EKb78JS85bb0mswU5CSdgp6UAHjIZqfJq00qQsViBCbXq3oklCPZXdQkOf5U0KpG2MVUiD-Zcn5Qj3gnUhSEr-5wKU9tWrE63MGPyE6KjZlArZX2W2LeGnW2CEYw9eREGon06AzLJ4mj3BgtjVWLIdGcCwORXvHRjUqazWgbEmXNVTbtp_cKnkW-rFzRBrUoVme9v-1Y3sH0VvHBq7QIj915VzBklzWs1qzIyTPZG5Db9LvdQ7SiV8slf1Jo7l-ayUUdVj6igvKZcgfB4RUHolJoMps5p4lZ5sPqv59KtSa8DCpuoRczIj71OCpuRVARZgy1m5sUD9xSMxOBdy46u1Jnry6iMtzXWI3mEZe5m7UhmW_L4Zcv4bbk8XjkBeHjPdgm2B69jkLmCBFecD5ztoGesCGt_pNo_sWSKqLHV1-coKFB2Nn__a4utU9NJNdeNRkr8_ahU6tn3jmaFjfQ7cKfrXG_NCcYBRX9fja8EQIeBEp_3TCoXQqhuV_bGsNPA2qL63Pt6YiRaUf1g9FNBqJRlKCSOYNixSXQZN_rTePzx0SQ0aIQhADWls62WX-LG5-byJcB6W2P_cH21hDOXkoNEIyLnCz9HQ6Yd6Fbv7298ps3F6jiUDdWES23zv8sDgBuKUN94qSN34j6MDYGFnGI9zsJ-Y-I2frdlLfWPx3pUL7afcKh1nRgXdjctsTSxU2BDrsu03eBz2IoZjoOR0U51IrNMOD1NNT3kctXxHLuOHSEkwAzS3doncQbdRLi5Gc1dQuOUa4sC-p8gVjUKXO-oi_49kp9Km2Ay9wFg0epBbXx2QMzyMsN2dXeSbHF-BDXD6sULaq5syC0fOHqaMLycTCMk2wLfNyXgEt05WvAiDn-LDsRdylMRW2hXp5HWq3Poaul-7VNg6UEMlwVfgJ-7hNreuO6IRtwmx6YdqMscw0ms6mU_MQZU_dTIPg3JU4KL0YyMqPBPSGNCx3gMp41O05Ubir45FoJSnT5Dkj4v3N0S87Ys3HuFLverASsGt9bkcSzd2uMKCJjkspemPPi9VhrY4IOO03DWSWbHmxYzFc1SJ-24WM8Ch404QKpe1qy5LNzFgLvDwQhSIHjluezHXqrD-DVh1lWNNY3WmHI2ubOZfaorvLKqzBPZ6AhpIa60rKjm0OZIQOmJwWXwkdnzut6m8PtoiLzRN897YMgeztf1nmDwp0xE-EhknVZ3WV3TeqgZJ5ykfHQ5BU8x0Db57-UtKSuesKbqPPdBe91OdsPpkGlyl6psHj1_gPm4nLvzXQePwiPaEemR_gYCWGPvl9l1ANJufgCV9qQTmZGof3fb9mjv-9lS-9l_m8KirPPRpSBToNeDtk50ceYUsOlDGzIyusppG9pOcIGyiln1IO5aZ8d4_1E83qjcHTSaKGizICZU7a-pt5STBPMesy3JgBm23A2jO4m68ayBRMcLnw_RirHvvBaj0C6UR2tac45F0Ob3PpXcvFuK0g54ziIAhzGqwF9I-LZ6asXQWMW4y4EBOak8JJBorkfztzfkMaIgGu-4ZoRKOkVfdr4uzcghk3r6KUxD4-nv1ioX69-G5RwhMHppYk7z8RXS1cq5FkvzXbfEQ-Uv6M-sx32DcUy9dH-ZYhc7UWm75JJfiNXLaXT_bsc6VqQ7KPkg2-RA7CywUFCW9S0S-XdO03VdwqlUVo7fp1SKywEfhZv_9bhDCdMJBwZmigv2KP9Iz7fF6LrpLwZkzHuQGFPcyTHFpsVIFrFyJjNYCXpET9y0Q5Vt4fnea5fy-9ZiCt3S8aS0YOFJ35_kM5i3ss8eFPL0v7fIQS3ZilzdGB3bWL0J7kppHN_ekHu-wVk3UZxauoFh7hXLjPcipua-FYUIklLjcK6DG1bYP7_q6OnkC8Jl650FNezeWPomHEv7l_DO3y0tjI6SGdWvL3ZJns7Xp3ew8KsCREAUO7ffqumD03uF9N-9uWbDDjM7rk0vcg0ggfOs9Ni725mxqYpu4R285XCOVWHDvw7iU6eAvE6ry8TDXQBbNgGjTuTYFYYli7GuOqMxFIe1op2s7sRnoJE8O0J76S6APhjhjcnZRSuONWkVG_5o83uFMPSF8DtqLwuRA5E8AGfIwAUcj324sw-DA0ixBGUqomb-osUIisv3x0b044xn-FvD-8R3PZDnPbPsao8XYNxfQWStrNcZSrX2Ua-WAcv9qbQ73_57RKW4pao4ajOu7K5800D231WGiIa6aJzDnFUlzXEzYxFQyx7qegkm_9rrEp_v8TC9mfAcjWX5DMrCkxUskx9YKDfpFYq4NuxO_414gReKzd-lmorfigvttgS10N1XD74SwFluXJv-bqTbI5-SuYAhDGMv1dqrn38i3rOMQqqnQomvaUJRprqxUsKz14sSE1Y-cNqq1FXzZ6vIJq-K3YTfFWPRLeqi6gHzqS_R2YBXXUduKuYgmakiVdP3bWc-Ca8WKh5sVi6P51MO-cS7i9AZWOaOz7F8PsB4JZxAJjSOr3NBmv3EEve9auTFCudRjfC6668I_NMHaTP5CCV4cuhuAxUuKUGgd6WFjDcvoYPyn_lu3bQiqD9MEag4CaJYI9PlraRv5mbqptwxv3pca7usd0GmXN_2No_nwxB4gVb48LsBBkH35njCa5iv2EKXUSOf0k3swaTSEahqbyI4EDzPXtU5uBO39iQzNpgfV_sUpnGdysjqueUVcdWGI_s5CnrNJ-_yDAY06AoXfLrjP8_3NXB2058xZ2rfmTNJNCULz9634dICJReXNnmplxIg3i6GbzFvjfNtqjrWr_iqBShyIwuOUJRbXzdJNggx2BDNG-PEWDXl89SaudFICkDvyZKEcATIss6ZXfULIMfCrqmWmFwgXfNEd9TuvjqoxFlLSaY4UfDMiYa_arUMblFfoo5nV07GANhUoQd-6HRe7LjYeX5VRodOx6ZmZjIAUq-DYr-hatJJFR2tjT_qZht2MJeYT3GZ3o54m8zBBt0JTN7HVpKaOaM3A2hEM_Ah0QZ-DkLDxtCzMuv987GDiLT2-Riya97a47yHIJhZFzFpflW2FcuC8RFWXlfUKTQfZkFmxh3MUekUuS4yu4Z121xojVswk_4P7-FqLaSnGT2epI69I_cvalRx3wjds9-5TFYqf4GridlFBRx6Fv2fpNB9Zvp9k7NQ9oYcPuXGLoXH5kmWBagPhEGKHA_pjFUZmCuwUIoeP4nP8lhFrX8OGezsbSBG773CRJzEdfcgAc5G-p6M_24WZLZHDrsVBAvgrNt6R9eQbEviWU28t_417QCp-or9qqt4OTKv1dp_4MlZh8YBg2-dtpvzSc1l5e4kQFJu7oWlpbgsjB6pl1oRRKp1maedX-gOAf559zC4l85gfEpPln9Cnl6xvERQzfO0Ey4q91SdsgK7i7FBrKKmi2wGiemFvnaQsrjZ_IFujLo8-2c8g9zTiyH1knyoVOAAnQxqGpsz6z6PNfSxr3_G8tOlNFTV-yqN_LdVHMgXtXjn3U9koGsfMulyUcBDdR3d_0Yn6iEjBt77tbxKi2ry-0gQrB1fdGsgKjyE_tMrW8D_lQz0IXsVOzd2ixsFVXMFzD6OOD8JldV0FbA-VDAS-Tp_ezIZVp6lRq54XBgvsjzDyOmOgDbSOQN6SQmvxPnIsml1wgmtm80z-9gHBqmimHBtLKB6L7CtLmmPICMS2pX3eWOmakxscxqs8AVjijJdz_NYNfcdBeDj_fhm6dqD6iwk3EBZZfsrmMGdXtAMqf1r9ng9tsz-FriXwQiJ3IM3loBsk5DKr9CcaJtKSPuwDDlRynD2vwcD-XyF6YTQdSJa9fEcq-qXya2Scj4mqQ4RDemJgErdradRfwJfII3fWHh18XxmYVqi9Bwn3YRgwEadyo0-HjbNq6vJXi12igmP99ciRAfMVQLjfUfTwoOHj44Y2Ru_hPjJcvB6FIn6KLrrCSrZnrshFdFn4L36z1CrS8fbtdvrG3kdZQxsUJnMqttuwKRpLnDWTWkIwj_GRBFrzCFgbwGp1XYhemxggyKVuhZPfyyTIM9rhlPth6eGyrpYfap24Av_mGPRBLnzcjtpGbACGdKQL034kVmI7yENGvmY40KSrWsVG_BE9bSJhx0EptFsT2IxnxbuFD4hGb4fFag9V0BDiKpUoOZqIVqVO8cAp-5w4twvWZKkrhu16JNlLoXWMoFANrw-tp5LKSin1CUeRa4LWVI1GR8tRkIad_GnCHRv9JEMswlNy9wi2sDNsSxWT7WNasUW5-glgK9pR7d2pXGGOWfHj1U6CKIqmAiO3iw8igzhvyx_dAxMxPo \ No newline at end of file diff --git a/features/data/journals/basic_folder/2020/08/29.txt b/features/data/journals/basic_folder/2020/08/29.txt deleted file mode 100644 index c8af54ca..00000000 --- a/features/data/journals/basic_folder/2020/08/29.txt +++ /dev/null @@ -1,19 +0,0 @@ -[2020-08-29 11:11:00 AM] Entry the first. -Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada -quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque -augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu -consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In -commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget -venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo. - -Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo -ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse -potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget -molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus -hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis -feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum -urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim. -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget -velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac -porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per -conubia nostra, per inceptos himenaeos. diff --git a/features/data/journals/basic_folder/2020/08/31.txt b/features/data/journals/basic_folder/2020/08/31.txt deleted file mode 100644 index 826e7cdb..00000000 --- a/features/data/journals/basic_folder/2020/08/31.txt +++ /dev/null @@ -1,23 +0,0 @@ -[2020-08-31 02:32:00 PM] A second entry in what I hope to be a long series. * -Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis leo -vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit amet, -consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl lorem, -vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum lectus, -eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium id -lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu, -egestas at efficitur et, ultrices vel est. Sed commodo et nibh non elementum. -Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome. - -Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel -vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum et -malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis sem, -non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel -ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a commodo -eros. - -Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non -tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor. -Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum -quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum -interdum. Integer id justo dui. Integer eu tellus in turpis bibendum blandit. -Quisque auctor lacinia consectetur. diff --git a/features/data/journals/basic_folder/2020/09/24.txt b/features/data/journals/basic_folder/2020/09/24.txt deleted file mode 100644 index 2bd885ce..00000000 --- a/features/data/journals/basic_folder/2020/09/24.txt +++ /dev/null @@ -1,11 +0,0 @@ -[2020-09-24 09:14:00 AM] The third entry finally after weeks without writing. -I'm so excited about emojis. 💯 🎶 💩 - -Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis. -Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla -eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis -dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada. -Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis -vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo. -Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at -ante eget fringilla. @tagthree and also @tagone diff --git a/features/data/journals/basic_onefile.journal b/features/data/journals/basic_onefile.journal deleted file mode 100644 index 0d988049..00000000 --- a/features/data/journals/basic_onefile.journal +++ /dev/null @@ -1,58 +0,0 @@ -[2020-08-29 11:11] Entry the first. - -Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada -quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque -augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu -consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In -commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget -venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo. - -Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo -ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse -potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget -molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus -hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis -feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum -urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim. -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget -velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac -porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per -conubia nostra, per inceptos himenaeos. - -[2020-08-31 14:32] A second entry in what I hope to be a long series. * - -Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis leo -vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit amet, -consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl lorem, -vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum lectus, -eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium id -lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu, -egestas at efficitur et, ultrices vel est. Sed commodo et nibh non elementum. -Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome. - -Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel -vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum et -malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis sem, -non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel -ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a commodo -eros. - -Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non -tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor. -Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum -quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum -interdum. Integer id justo dui. Integer eu tellus in turpis bibendum blandit. -Quisque auctor lacinia consectetur. - -[2020-09-24 09:14] The third entry finally after weeks without writing. - -I'm so excited about emojis. 💯 🎶 💩 - -Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis. -Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla -eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis -dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada. -Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis -vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo. -Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at -ante eget fringilla. @tagthree and also @tagone diff --git a/features/data/journals/brackets.journal b/features/data/journals/brackets.journal deleted file mode 100644 index 4649ea3e..00000000 --- a/features/data/journals/brackets.journal +++ /dev/null @@ -1,2 +0,0 @@ -[2019-07-08 05:42] Entry subject -[1] line starting with 1 diff --git a/features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D511.doentry b/features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D511.doentry deleted file mode 100644 index 066821bb..00000000 --- a/features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D511.doentry +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Creation Date - 2013-10-27T02:27:27Z - Creator - - Device Agent - iPhone/iPhone3,1 - Generation Date - 2013-10-27T07:02:27Z - Host Name - omrt104001 - OS Agent - iOS/7.0.3 - Software Agent - Day One (iOS)/1.11.4 - - Entry Text - Some text. - Location - - Administrative Area - Östergötlands län - Country - Sverige - Latitude - 58.383400000000000 - Locality - City - Longitude - 15.577170000000000 - Place Name - Street - - Starred - - Time Zone - Europe/Stockholm - UUID - B40EE704E15846DE8D45C44118A4D511 - Weather - - Celsius - 12 - Description - Clear - Fahrenheit - 54 - IconName - sunnyn.png - - - diff --git a/features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D512.doentry b/features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D512.doentry deleted file mode 100644 index ea3efec5..00000000 --- a/features/data/journals/bug153.dayone/entries/B40EE704E15846DE8D45C44118A4D512.doentry +++ /dev/null @@ -1,52 +0,0 @@ - - Creation Date - 2013-10-27T02:27:27Z - Creator - - Device Agent - iPhone/iPhone3,1 - Generation Date - 2013-10-27T07:02:27Z - Host Name - omrt104001 - OS Agent - iOS/7.0.3 - Software Agent - Day One (iOS)/1.11.4 - - Entry Text - This is not a valid plist. - Location - - Administrative Area - Östergötlands län - Country - Sverige - Latitude - 58.383400000000000 - Locality - City - Longitude - 15.577170000000000 - Place Name - Street - - Starred - - Time Zone - Europe/Stockholm - UUID - B40EE704E15846DE8D45C44118A4D511 - Weather - - Celsius - 12 - Description - Clear - Fahrenheit - 54 - IconName - sunnyn.png - - - diff --git a/features/data/journals/bug780.dayone/entries/48A25033B34047C591160A4480197D8B.doentry b/features/data/journals/bug780.dayone/entries/48A25033B34047C591160A4480197D8B.doentry deleted file mode 100644 index 426f1ea8..00000000 --- a/features/data/journals/bug780.dayone/entries/48A25033B34047C591160A4480197D8B.doentry +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Activity - Stationary - Creation Date - 2019-12-30T21:28:54Z - Entry Text - - Starred - - UUID - 48A25033B34047C591160A4480197D8B - Creator - - Device Agent - PC - Generation Date - 2019-12-30T21:28:54Z - Host Name - LE-TREPORT - OS Agent - Microsoft Windows/10 Home - Software Agent - Journaley/2.1 - - Tags - - i_have_no_body - - - diff --git a/features/data/journals/dayone.dayone/entries/044F3747A38546168B572C2E3F217FA2.doentry b/features/data/journals/dayone.dayone/entries/044F3747A38546168B572C2E3F217FA2.doentry deleted file mode 100644 index 1ac26242..00000000 --- a/features/data/journals/dayone.dayone/entries/044F3747A38546168B572C2E3F217FA2.doentry +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Creation Date - 2013-05-17T18:39:20Z - Creator - - Device Agent - Macintosh/MacBookAir5,2 - Generation Date - 2013-08-17T18:39:20Z - Host Name - Egeria - OS Agent - Mac OS X/10.8.4 - Software Agent - Day One (Mac)/1.8 - - Entry Text - This entry has tags! - Starred - - Tags - - work - PLaY - - Time Zone - America/Los_Angeles - UUID - 044F3747A38546168B572C2E3F217FA2 - - diff --git a/features/data/journals/dayone.dayone/entries/0BDDD6CDA43C4A9AA2681517CC35AD9D.doentry b/features/data/journals/dayone.dayone/entries/0BDDD6CDA43C4A9AA2681517CC35AD9D.doentry deleted file mode 100644 index 927de884..00000000 --- a/features/data/journals/dayone.dayone/entries/0BDDD6CDA43C4A9AA2681517CC35AD9D.doentry +++ /dev/null @@ -1,46 +0,0 @@ - - - - - Creation Date - 2013-06-17T18:38:29Z - Creator - - Device Agent - Macintosh/MacBookAir5,2 - Generation Date - 2013-08-17T18:38:29Z - Host Name - Egeria - OS Agent - Mac OS X/10.8.4 - Software Agent - Day One (Mac)/1.8 - - Entry Text - This entry has a location. - Location - - Administrative Area - California - Country - Germany - Latitude - 52.4979764 - Locality - Berlin - Longitude - 13.2404758 - Place Name - Abandoned Spy Tower - - Starred - - Tags - - Time Zone - Europe/Berlin - UUID - 0BDDD6CDA43C4A9AA2681517CC35AD9D - - diff --git a/features/data/journals/dayone.dayone/entries/422BC895507944A291E6FC44FC6B8BFC.doentry b/features/data/journals/dayone.dayone/entries/422BC895507944A291E6FC44FC6B8BFC.doentry deleted file mode 100644 index 16260763..00000000 --- a/features/data/journals/dayone.dayone/entries/422BC895507944A291E6FC44FC6B8BFC.doentry +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Creation Date - 2013-07-17T18:38:08Z - Creator - - Device Agent - Macintosh/MacBookAir5,2 - Generation Date - 2013-08-17T18:38:08Z - Host Name - Egeria - OS Agent - Mac OS X/10.8.4 - Software Agent - Day One (Mac)/1.8 - - Entry Text - This entry is starred! - Starred - - Tags - - Time Zone - America/Los_Angeles - UUID - 422BC895507944A291E6FC44FC6B8BFC - - diff --git a/features/data/journals/dayone.dayone/entries/4BB1F46946AD439996C9B59DE7C4DDC1.doentry b/features/data/journals/dayone.dayone/entries/4BB1F46946AD439996C9B59DE7C4DDC1.doentry deleted file mode 100644 index 9ebaf538..00000000 --- a/features/data/journals/dayone.dayone/entries/4BB1F46946AD439996C9B59DE7C4DDC1.doentry +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Creation Date - 2013-01-17T18:37:50Z - Creator - - Device Agent - Macintosh/MacBookAir5,2 - Generation Date - 2013-08-17T18:37:50Z - Host Name - Egeria - OS Agent - Mac OS X/10.8.4 - Software Agent - Day One (Mac)/1.8 - - Entry Text - This is a DayOne entry without Timezone. - Starred - - Tags - - UUID - 4BB1F46946AD439996C9B59DE7C4DDC1 - - diff --git a/features/data/journals/dayone_empty.dayone/entries/empty.txt b/features/data/journals/dayone_empty.dayone/entries/empty.txt deleted file mode 100644 index c86b8f66..00000000 --- a/features/data/journals/dayone_empty.dayone/entries/empty.txt +++ /dev/null @@ -1 +0,0 @@ -This file exists to preserve the directory structure, but should be ignored by jrnl. diff --git a/features/data/journals/deletion.journal b/features/data/journals/deletion.journal deleted file mode 100644 index c0fa689d..00000000 --- a/features/data/journals/deletion.journal +++ /dev/null @@ -1,5 +0,0 @@ -[2019-10-29 11:11] First entry. - -[2019-10-29 11:11] Second entry. - -[2019-10-29 11:13] Third entry. \ No newline at end of file diff --git a/features/data/journals/deletion_filters.journal b/features/data/journals/deletion_filters.journal deleted file mode 100644 index 9a3747db..00000000 --- a/features/data/journals/deletion_filters.journal +++ /dev/null @@ -1,14 +0,0 @@ -[2019-10-01 08:00] It's just another day in October. -Not much to write about. - -[2020-01-01 08:00] Happy New Year! -So this is the New Year. @holidays - -[2020-03-01 08:00] It's just another day in March. -A stick, a stone, it's the end of the road. - -[2020-05-01 09:00] Happy May Day! -@holidays @springtime Several holidays fall on this date. - -[2020-05-02 12:10] Writing tests. * -@springtime They will help prevent bugs. diff --git a/features/data/journals/empty_folder/empty b/features/data/journals/empty_folder/empty deleted file mode 100644 index 175b82b5..00000000 --- a/features/data/journals/empty_folder/empty +++ /dev/null @@ -1 +0,0 @@ -Nothing to see here diff --git a/features/data/journals/encrypted.journal b/features/data/journals/encrypted.journal deleted file mode 100644 index d2a5fcbe..00000000 --- a/features/data/journals/encrypted.journal +++ /dev/null @@ -1 +0,0 @@ -gAAAAABVIHB7tnwKExG7aC5ZbAbBL9SG2oY2GENeoOJ22i1PZigOvCYvrQN3kpsu0KGr7ay5K-_46R5YFlqJvtQ8anPH2FSITsaZy-l5Lz_5quw3rmzhLwAR1tc0icgtR4MEpXEdsuQ7cyb12Xq-JLDrnATs0id5Vow9Ri_tE7Xe4BXgXaySn3aRPwWKoninVxVPVvETY3MXHSUEXV9OZ-pH5kYBLGYbLA== diff --git a/features/data/journals/encrypted_jrnl-1-9-5.journal b/features/data/journals/encrypted_jrnl-1-9-5.journal deleted file mode 100644 index 339b47baf9671f4550efeb9b6a0cfcd5032255d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmV-`0Du3(bJIGVsY(mXmoW-2hF&*L`0NbJTYlTUr8*^Qm97}8E^3^1bZ$P^M diff --git a/features/data/journals/little_endian_dates.journal b/features/data/journals/little_endian_dates.journal deleted file mode 100644 index d7492969..00000000 --- a/features/data/journals/little_endian_dates.journal +++ /dev/null @@ -1,5 +0,0 @@ -[09.06.2013 15:39] My first entry. -Everything is alright - -[10.07.2013 15:40] Life is good. -But I'm better. diff --git a/features/data/journals/markdown-headings-335.journal b/features/data/journals/markdown-headings-335.journal deleted file mode 100644 index 30f592ef..00000000 --- a/features/data/journals/markdown-headings-335.journal +++ /dev/null @@ -1,42 +0,0 @@ -[2015-04-14 13:23] Heading Test - -H1-1 -= - -H1-2 -=== - -H1-3 -============================ - -H2-1 -- - -H2-2 ---- - -H2-3 ----------------------------------- - -Horizontal Rules (ignore) - ---- - -=== - -# ATX H1 - -## ATX H2 - -### ATX H3 - -#### ATX H4 - -##### ATX H5 - -###### ATX H6 - -Stuff - -More stuff -more stuff again diff --git a/features/data/journals/mostlyreadabledates.journal b/features/data/journals/mostlyreadabledates.journal deleted file mode 100644 index bd211bf5..00000000 --- a/features/data/journals/mostlyreadabledates.journal +++ /dev/null @@ -1,8 +0,0 @@ -[2019-07-18 14:23] Entry subject -Time machines are possible. I know, because I've built one in my garage. - -[2019-07-19 14:23] Entry subject -I'm going to activate the machine. Nobody knows what comes next after this. Or before this? - -[2019-07 14:23] Entry subject -I've crossed so many timelines. Is there any going back? diff --git a/features/data/journals/multiline-tags.journal b/features/data/journals/multiline-tags.journal deleted file mode 100644 index 1fb8706f..00000000 --- a/features/data/journals/multiline-tags.journal +++ /dev/null @@ -1,7 +0,0 @@ -[2013-06-09 15:39] Multiple @line entry with @tags. -Tag with @punctuation. afterwards -@TagOnLineAloneWithOutPunctuation -@TagOnLineAloneWithPunctuation. -Text before @tag. And After. -@hi. Hello -hi Hello \ No newline at end of file diff --git a/features/data/journals/multiline.journal b/features/data/journals/multiline.journal deleted file mode 100644 index 294ed141..00000000 --- a/features/data/journals/multiline.journal +++ /dev/null @@ -1,5 +0,0 @@ -[2013-06-09 15:39] Multiple line entry. -This is the first line. -This line doesn't have any ending punctuation - -There is a blank line above this. diff --git a/features/data/journals/simple.journal b/features/data/journals/simple.journal deleted file mode 100644 index 8336068e..00000000 --- a/features/data/journals/simple.journal +++ /dev/null @@ -1,5 +0,0 @@ -[2013-06-09 15:39] My first entry. -Everything is alright - -[2013-06-10 15:40] Life is good. -But I'm better. diff --git a/features/data/journals/simple_jrnl-1-9-5.journal b/features/data/journals/simple_jrnl-1-9-5.journal deleted file mode 100644 index 7bb6c5ac..00000000 --- a/features/data/journals/simple_jrnl-1-9-5.journal +++ /dev/null @@ -1,13 +0,0 @@ -2010-06-10 15:00 A life without chocolate is like a bad analogy. - -2013-06-10 15:40 He said "[this] is the best time to be alive". -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada -quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque -augue et venenatis facilisis. - -[2019-08-03 12:55] Some chat log or something - -Suspendisse potenti. Sed dignissim sed nisl eu consequat. Aenean ante ex, -elementum ut interdum et, mattis eget lacus. In commodo nulla nec tellus -placerat, sed ultricies metus bibendum. Duis eget venenatis erat. In at dolor -dui. diff --git a/features/data/journals/simple_jrnl-1-9-5_little_endian_dates.journal b/features/data/journals/simple_jrnl-1-9-5_little_endian_dates.journal deleted file mode 100644 index 328b23f4..00000000 --- a/features/data/journals/simple_jrnl-1-9-5_little_endian_dates.journal +++ /dev/null @@ -1,13 +0,0 @@ -10.06.2010 15:00 A life without chocolate is like a bad analogy. - -10.06.2013 15:40 He said "[this] is the best time to be alive". -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada -quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque -augue et venenatis facilisis. - -[03.08.2019 12:55] Some chat log or something - -Suspendisse potenti. Sed dignissim sed nisl eu consequat. Aenean ante ex, -elementum ut interdum et, mattis eget lacus. In commodo nulla nec tellus -placerat, sed ultricies metus bibendum. Duis eget venenatis erat. In at dolor -dui. diff --git a/features/data/journals/tags-216.journal b/features/data/journals/tags-216.journal deleted file mode 100644 index 08b6d630..00000000 --- a/features/data/journals/tags-216.journal +++ /dev/null @@ -1,2 +0,0 @@ -[2013-06-10 15:40] I programmed for @OS/2. -Almost makes me want to go back to @C++, though. (Still better than @C#). diff --git a/features/data/journals/tags-237.journal b/features/data/journals/tags-237.journal deleted file mode 100644 index be050652..00000000 --- a/features/data/journals/tags-237.journal +++ /dev/null @@ -1,3 +0,0 @@ -[2014-07-22 11:11] This entry has an email. -@Newline tag should show as a tag. -Kyla's @email is kyla@clevelandunderdog.org and Guinness's is guinness@fortheloveofpits.org. diff --git a/features/data/journals/tags.journal b/features/data/journals/tags.journal deleted file mode 100644 index a28f3159..00000000 --- a/features/data/journals/tags.journal +++ /dev/null @@ -1,8 +0,0 @@ -[2013-04-09 15:39] I have an @idea: -(1) write a command line @journal software -(2) ??? -(3) PROFIT! - -[2013-06-10 15:40] I met with @dan. -As alway's he shared his latest @idea on how to rule the world with me. -inst diff --git a/features/data/journals/unreadabledates.journal b/features/data/journals/unreadabledates.journal deleted file mode 100644 index 53ef1d60..00000000 --- a/features/data/journals/unreadabledates.journal +++ /dev/null @@ -1,5 +0,0 @@ -[ashasd7zdskhz7asdkjasd] Entry subject -I've lost track of time. - -[sadfhakjsdf88sdf7sdff] Entry subject -Time has no meaning. diff --git a/features/data/journals/work.journal b/features/data/journals/work.journal deleted file mode 100644 index e69de29b..00000000 diff --git a/features/data/templates/extension.md b/features/data/templates/extension.md deleted file mode 100644 index e69de29b..00000000 diff --git a/features/data/templates/sample.template b/features/data/templates/sample.template deleted file mode 100644 index a356d823..00000000 --- a/features/data/templates/sample.template +++ /dev/null @@ -1,19 +0,0 @@ ---- -extension: txt ---- - -{% block journal %} -{% for entry in entries %} -{% include entry %} -{% endfor %} - -{% endblock %} - -{% block entry %} -{{ entry.title }} -{{ "-" * len(entry.title) }} - -{{ entry.body }} - -{% endblock %} -` diff --git a/features/datetime.feature b/features/datetime.feature deleted file mode 100644 index 8fe335c9..00000000 --- a/features/datetime.feature +++ /dev/null @@ -1,155 +0,0 @@ -Feature: Reading and writing to journal with custom date formats - - Scenario: Dates can include a time - # https://github.com/jrnl-org/jrnl/issues/117 - Given we use the config "simple.yaml" - When we run "jrnl 2013-11-30 15:42: Project Started." - Then we should see the message "Entry added" - And the journal should contain "[2013-11-30 15:42] Project Started." - - Scenario: Dates can be in the future - # https://github.com/jrnl-org/jrnl/issues/185 - Given we use the config "simple.yaml" - When we run "jrnl 26/06/2099: Planet? Earth. Year? 2099." - Then we should see the message "Entry added" - And the journal should contain "[2099-06-26 09:00] Planet?" - - Scenario: Loading a sample journal with custom date - Given we use the config "little_endian_dates.yaml" - When we run "jrnl -n 2" - Then we should get no error - And the output should be - """ - 09.06.2013 15:39 My first entry. - | Everything is alright - - 10.07.2013 15:40 Life is good. - | But I'm better. - """ - - Scenario Outline: Writing an entry from command line with custom date - Given we use the config ".yaml" - When we run "jrnl " - Then we should see the message "Entry added" - When we run "jrnl -n 1" - Then the output should contain "" - - Examples: Day-first Dates - | config | input | output | - | little_endian_dates | 2020-09-19: My first entry. | 19.09.2020 09:00 My first entry. | - | little_endian_dates | 2020-08-09: My second entry. | 09.08.2020 09:00 My second entry. | - | little_endian_dates | 2020-02-29: Test. | 29.02.2020 09:00 Test. | - | little_endian_dates | 2019-02-29: Test. | 2019-02-29: Test. | - | little_endian_dates | 2020-08-32: Test. | 2020-08-32: Test. | - | little_endian_dates | 2032-02-01: Test. | 01.02.2032 09:00 Test. | - | little_endian_dates | 2020-01-01: Test. | 01.01.2020 09:00 Test. | - | little_endian_dates | 2020-12-31: Test. | 31.12.2020 09:00 Test. | - - Scenario Outline: Searching for dates with custom date - Given we use the config ".yaml" - When we run "jrnl -on '' --short" - Then the output should be "" - - Examples: Day-first Dates - | config | input | output | - | little_endian_dates | 2013-07-10 | 10.07.2013 15:40 Life is good. | - | little_endian_dates | june 9 2013 | 09.06.2013 15:39 My first entry. | - | little_endian_dates | july 10 2013 | 10.07.2013 15:40 Life is good. | - | little_endian_dates | june 2013 | 09.06.2013 15:39 My first entry. | - | little_endian_dates | july 2013 | 10.07.2013 15:40 Life is good. | - # @todo month alone with no year should work - # | little_endian_dates | june | 09.06.2013 15:39 My first entry. | - # | little_endian_dates | july | 10.07.2013 15:40 Life is good. | - - Scenario: Writing an entry at the prompt with custom date - Given we use the config "little_endian_dates.yaml" - When we run "jrnl" and enter "2013-05-10: I saw Elvis. He's alive." - Then we should get no error - And the journal should contain "[10.05.2013 09:00] I saw Elvis." - And the journal should contain "He's alive." - - Scenario: Viewing today's entries does not print the entire journal - # https://github.com/jrnl-org/jrnl/issues/741 - Given we use the config "simple.yaml" - When we run "jrnl -on today" - Then the output should not contain "Life is good" - And the output should not contain "But I'm better." - - Scenario Outline: Create entry using day of the week as entry date. - Given we use the config "simple.yaml" - When we run "jrnl : This is an entry on a ." - Then we should see the message "Entry added" - When we run "jrnl -1" - Then the output should contain " at 9am" in the local time - And the output should contain "This is an entry on a ." - - Examples: Days of the week - | day | - | Monday | - | Tuesday | - | Wednesday | - | Thursday | - | Friday | - | Saturday | - | Sunday | - | sunday | - | sUndAy | - - Scenario Outline: Create entry using day of the week abbreviations as entry date. - Given we use the config "simple.yaml" - When we run "jrnl : This is an entry on a ." - Then we should see the message "Entry added" - When we run "jrnl -1" - Then the output should contain " at 9am" in the local time - - Examples: Days of the week - | day | weekday | - | mon | Monday | - | tue | Tuesday | - | wed | Wednesday | - | thu | Thursday | - | fri | Friday | - | sat | Saturday | - | sun | Sunday | - - Scenario: Journals with unreadable dates should still be loaded - Given we use the config "unreadabledates.yaml" - When we run "jrnl -2" - Then the output should contain "I've lost track of time." - And the output should contain "Time has no meaning." - - Scenario: Journals with readable dates AND unreadable dates should still contain all data. - Given we use the config "mostlyreadabledates.yaml" - When we run "jrnl -3" - Then the output should contain "Time machines are possible." - Then the output should contain "I'm going to activate the machine." - And the output should contain "I've crossed so many timelines. Is there any going back?" - And the journal should have 3 entries - - Scenario: Update near-valid dates after journal is edited - Given we use the config "mostlyreadabledates.yaml" - When we run "jrnl 2222-08-19: I have made it exactly one month into the future." - Then the journal should contain "[2019-07-01 14:23] Entry subject" - - Scenario: Integers in square brackets should not be read as dates - Given we use the config "brackets.yaml" - When we run "jrnl -1" - Then the output should contain "[1] line starting with 1" - - # broken still - @skip - Scenario: Dayone entries without timezone information are interpreted in current timezone - Given we use the config "dayone.yaml" - When we run "jrnl -until 'feb 2013'" - Then we should get no error - And the output should contain "2013-01-17T18:37Z" in the local time - - Scenario: Loading entry with ambiguous time stamp in timezone-aware journal (like Dayone) - #https://github.com/jrnl-org/jrnl/issues/153 - Given we use the config "bug153.yaml" - When we run "jrnl -1" - Then we should get no error - And the output should be - """ - 2013-10-27 03:27 Some text. - """ diff --git a/features/delete.feature b/features/delete.feature deleted file mode 100644 index 2fc3f8f7..00000000 --- a/features/delete.feature +++ /dev/null @@ -1,229 +0,0 @@ -Feature: Delete entries from journal - Scenario Outline: Delete flag allows deletion of single entry - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -1" - Then the output should contain "2020-09-24 09:14 The third entry finally" - When we run "jrnl --delete" and enter - """ - N - N - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-29 11:11 Entry the first. - 2020-08-31 14:32 A second entry in what I hope to be a long series. - """ - - Examples: Configs - | config | - | basic_onefile | - | basic_encrypted | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: Backing out of interactive delete does not change journal - Given we use the config ".yaml" - When we run "jrnl --delete -n 1" and enter - """ - N - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-29 11:11 Entry the first. - 2020-08-31 14:32 A second entry in what I hope to be a long series. - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - - Scenario Outline: Delete flag with nonsense input deletes nothing (issue #932) - Given we use the config ".yaml" - When we run "jrnl --delete asdfasdf" - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-29 11:11 Entry the first. - 2020-08-31 14:32 A second entry in what I hope to be a long series. - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Delete flag with tag only deletes tagged entries - Given we use the config ".yaml" - When we run "jrnl --delete @ipsum" and enter - """ - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-31 14:32 A second entry in what I hope to be a long series. - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - - Scenario Outline: Delete flag with multiple tags deletes all entries matching any of the tags - Given we use the config ".yaml" - When we run "jrnl --delete @ipsum @tagthree" and enter - """ - Y - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-31 14:32 A second entry in what I hope to be a long series. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: Delete flag with -and deletes boolean AND of tagged entries - Given we use the config ".yaml" - When we run "jrnl --delete -and @tagone @tagtwo" and enter - """ - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-31 14:32 A second entry in what I hope to be a long series. - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: Delete flag with -not does not delete entries from given tag - Given we use the config ".yaml" - When we run "jrnl --delete @tagone -not @ipsum" and enter - """ - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-29 11:11 Entry the first. - 2020-08-31 14:32 A second entry in what I hope to be a long series. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: Delete flag with -from search operator only deletes entries since that date - Given we use the config ".yaml" - When we run "jrnl --delete -from 2020-09-01" and enter - """ - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-29 11:11 Entry the first. - 2020-08-31 14:32 A second entry in what I hope to be a long series. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: Delete flag with -to only deletes entries up to specified date - Given we use the config ".yaml" - When we run "jrnl --delete -to 2020-08-31" and enter - """ - Y - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - - Scenario Outline: Delete flag with -starred only deletes starred entries - Given we use the config ".yaml" - When we run "jrnl --delete -starred" and enter - """ - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-29 11:11 Entry the first. - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: Delete flag with -contains only entries containing expression - Given we use the config ".yaml" - When we run "jrnl --delete -contains dignissim" and enter - """ - Y - """ - Then we flush the output - When we run "jrnl -99 --short" - Then the output should be - """ - 2020-08-31 14:32 A second entry in what I hope to be a long series. - 2020-09-24 09:14 The third entry finally after weeks without writing. - """ - - Examples: Configs - | config | - | basic_onefile | - # | basic_folder | @todo - # | basic_dayone | @todo - diff --git a/features/encrypt.feature b/features/encrypt.feature deleted file mode 100644 index f2d0a62f..00000000 --- a/features/encrypt.feature +++ /dev/null @@ -1,35 +0,0 @@ -Feature: Encrypting and decrypting journals - - Scenario: Decrypting a journal - Given we use the config "encrypted.yaml" - When we run "jrnl --decrypt" and enter "bad doggie no biscuit" - Then the config for journal "default" should have "encrypt" set to "bool:False" - And we should see the message "Journal decrypted" - And the journal should have 2 entries - - @todo - Scenario: Trying to decrypt an already unencrypted journal - # This should warn the user that the journal is already encrypted - Given we use the config "simple.yaml" - When we run "jrnl --decrypt" - Then the config for journal "default" should have "encrypt" set to "bool:False" - And the journal should have 2 entries - - @todo - Scenario: Trying to encrypt an already encrypted journal - # This should warn the user that the journal is already encrypted - - Scenario: Encrypting a journal - Given we use the config "simple.yaml" - When we run "jrnl --encrypt" and enter - """ - swordfish - swordfish - n - """ - Then we should see the message "Journal encrypted" - And the config for journal "default" should have "encrypt" set to "bool:True" - When we run "jrnl -n 1" and enter "swordfish" - Then we should be prompted for a password - And the output should contain "2013-06-10 15:40 Life is good" - diff --git a/features/environment.py b/features/environment.py deleted file mode 100644 index f4baab34..00000000 --- a/features/environment.py +++ /dev/null @@ -1,86 +0,0 @@ -import os -import shutil - -from jrnl.os_compat import on_windows - -CWD = os.getcwd() - -# @see https://behave.readthedocs.io/en/latest/tutorial.html#debug-on-error-in-case-of-step-failures -BEHAVE_DEBUG_ON_ERROR = False - - -def setup_debug_on_error(userdata): - global BEHAVE_DEBUG_ON_ERROR - BEHAVE_DEBUG_ON_ERROR = userdata.getbool("BEHAVE_DEBUG_ON_ERROR") - - -def before_all(context): - setup_debug_on_error(context.config.userdata) - - -# def after_step(context, step): -# if BEHAVE_DEBUG_ON_ERROR and step.status == "failed": -# -- ENTER DEBUGGER: Zoom in on failure location. -# NOTE: Use IPython debugger, same for pdb (basic python debugger). -# import ipdb -# ipdb.post_mortem(step.exc_traceback) - - -def clean_all_working_dirs(): - if os.path.exists("test.txt"): - os.remove("test.txt") - for folder in ("configs", "journals", "cache"): - working_dir = os.path.join("features", folder) - if os.path.exists(working_dir): - shutil.rmtree(working_dir) - - -def before_feature(context, feature): - # add "skip" tag - # https://stackoverflow.com/a/42721605/4276230 - if "skip" in feature.tags: - feature.skip() - return - - if "skip_win" in feature.tags and on_windows(): - feature.skip("Skipping on Windows") - return - - -def before_scenario(context, scenario): - """Before each scenario, backup all config and journal test data.""" - # Clean up in case something went wrong - clean_all_working_dirs() - for folder in ("configs", "journals"): - original = os.path.join("features", "data", folder) - working_dir = os.path.join("features", folder) - if not os.path.exists(working_dir): - os.mkdir(working_dir) - for filename in os.listdir(original): - source = os.path.join(original, filename) - if os.path.isdir(source): - shutil.copytree(source, os.path.join(working_dir, filename)) - else: - shutil.copy2(source, working_dir) - - # add "skip" tag - # https://stackoverflow.com/a/42721605/4276230 - if "skip" in scenario.effective_tags: - scenario.skip() - return - - if "skip_win" in scenario.effective_tags and on_windows(): - scenario.skip("Skipping on Windows") - return - - -def after_scenario(context, scenario): - """After each scenario, restore all test data and remove working_dirs.""" - if os.getcwd() != CWD: - os.chdir(CWD) - - # only clean up if debugging is off and the scenario passed - if BEHAVE_DEBUG_ON_ERROR and scenario.status != "failed": - clean_all_working_dirs() - else: - clean_all_working_dirs() diff --git a/features/file_storage.feature b/features/file_storage.feature deleted file mode 100644 index 33619365..00000000 --- a/features/file_storage.feature +++ /dev/null @@ -1,56 +0,0 @@ -Feature: Journals iteracting with the file system in a way that users can see - - Scenario: Adding entries to a Folder journal should generate date files - Given we use the config "empty_folder.yaml" - When we run "jrnl 23 July 2013: Testing folder journal." - Then we should see the message "Entry added" - When the journal directory is listed - Then the output should contain "2013/07/23.txt" or "2013\07\23.txt" - - Scenario: Adding multiple entries to a Folder journal should generate multiple date files - Given we use the config "empty_folder.yaml" - When we run "jrnl 23 July 2013: Testing folder journal." - And we run "jrnl 3/7/2014: Second entry of journal." - Then we should see the message "Entry added" - When the journal directory is listed - Then the output should contain "2013/07/23.txt" or "2013\07\23.txt" - Then the output should contain "2014/03/07.txt" or "2014\03\07.txt" - - Scenario: If the journal and its parent directory don't exist, they should be created - Given we use the config "missing_directory.yaml" - Then the journal should not exist - When we run "jrnl This is a new entry in my journal" - Then the journal should exist - When we run "jrnl -n 1" - Then the output should contain "This is a new entry in my journal" - And the journal should have 1 entry - - Scenario: If the journal file doesn't exist, then it should be created - Given we use the config "missing_journal.yaml" - Then the journal should not exist - When we run "jrnl This is a new entry in my journal" - Then the journal should exist - When we run "jrnl -n 1" - Then the output should contain "This is a new entry in my journal" - And the journal should have 1 entry - - Scenario: Creating journal with relative path should update to absolute path - Given we use the config "missingconfig" - When we run "jrnl hello world" and enter - """ - test.txt - n - """ - And we change directory to "features" - And we run "jrnl -n 1" - Then the output should contain "hello world" - - Scenario: the temporary filename suffix should default to ".jrnl" - Given we use the config "editor.yaml" - When we run "jrnl --edit" - Then the temporary filename suffix should be ".jrnl" - - Scenario: the temporary filename suffix should be "-{template_filename}" - Given we use the config "editor_markdown_extension.yaml" - When we run "jrnl --edit" - Then the temporary filename suffix should be "-extension.md" diff --git a/features/format.feature b/features/format.feature deleted file mode 100644 index f935e8c8..00000000 --- a/features/format.feature +++ /dev/null @@ -1,621 +0,0 @@ -Feature: Custom formats - - Scenario Outline: Short printing via --format flag - Given We use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --format short -3" - Then we should get no error - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Pretty Printing aka the Default - Given We use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --format pretty -3" - Then we should get no error - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: JSON format - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --format json" - Then we should get no error - And the output should be parsable as json - And "entries" in the json output should have 3 elements - And "tags" in the json output should contain "@ipsum" - And "tags" in the json output should contain "@tagone" - And "tags" in the json output should contain "@tagthree" - And "tags" in the json output should contain "@tagtwo" - And entry 1 should have an array "tags" with 3 elements - And entry 2 should have an array "tags" with 1 elements - And entry 3 should have an array "tags" with 2 elements - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario: Exporting dayone to json - Given we use the config "dayone.yaml" - When we run "jrnl --export json" - Then we should get no error - And the output should be parsable as json - And the json output should contain entries.0.uuid = "4BB1F46946AD439996C9B59DE7C4DDC1" - - Scenario Outline: Printing a journal that has multiline entries with tags - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -n 1 @ipsum" - Then we should get no error - And the output should be - """ - 2020-08-29 11:11 Entry the first. - | Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada - | quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus - | pellentesque - | augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu - | consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In - | commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget - | venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo. - | - | Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo - | ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse - | potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget - | molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus - | hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis - | feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum - | urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim. - | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget - | velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac - | porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per - | conubia nostra, per inceptos himenaeos. - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Exporting using filters should only export parts of the journal - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -until 'August 2020' --format json" - Then the output should be parsable as json - Then we should get no error - And the output should be parsable as json - And "entries" in the json output should have 2 elements - And "tags" in the json output should contain "@ipsum" - And "tags" in the json output should contain "@tagone" - And "tags" in the json output should contain "@tagtwo" - And entry 1 should have an array "tags" with 3 elements - And entry 2 should have an array "tags" with 1 elements - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Exporting using custom templates - Given we use the config ".yaml" - And we load template "sample.template" - And we use the password "test" if prompted - When we run "jrnl -1 --format sample" - Then the output should be - """ - The third entry finally after weeks without writing. - ---------------------------------------------------- - - I'm so excited about emojis. 💯 🎶 💩 - - Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis. - Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla - eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis - dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada. - Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis - vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo. - Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at - ante eget fringilla. @tagthree and also @tagone - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Increasing Headings on Markdown export - Given we use the config ".yaml" - And we use the password "test" if prompted - When we open the editor and append - """ - [2020-10-14 13:23] Heading Test - - H1-1 - = - - H1-2 - === - - H1-3 - ============================ - - H2-1 - - - - H2-2 - --- - - H2-3 - ---------------------------------- - - Horizontal Rules (ignore) - - --- - - === - - # ATX H1 - - ## ATX H2 - - ### ATX H3 - - #### ATX H4 - - ##### ATX H5 - - ###### ATX H6 - - Stuff - - More stuff - more stuff again - """ - Then we flush the output - When we run "jrnl -1 --export markdown" - Then the output should be - """ - # 2020 - - ## October - - ### 2020-10-14 13:23 Heading Test - - #### H1-1 - - #### H1-2 - - #### H1-3 - - ##### H2-1 - - ##### H2-2 - - ##### H2-3 - - Horizontal Rules (ignore) - - --- - - === - - #### ATX H1 - - ##### ATX H2 - - ###### ATX H3 - - ####### ATX H4 - - ######## ATX H5 - - ######### ATX H6 - - Stuff - - More stuff - more stuff again - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - # | basic_dayone | @todo - - Scenario Outline: Add a blank line to Markdown export if there isn't one already - # https://github.com/jrnl-org/jrnl/issues/768 - # https://github.com/jrnl-org/jrnl/issues/881 - Given we use the config ".yaml" - And we use the password "test" if prompted - When we open the editor and append - """ - [2020-10-29 11:11] First entry. - [2020-10-29 11:11] Second entry. - [2020-10-29 11:13] Third entry. - """ - Then we flush the output - When we run "jrnl -3 --format markdown" - Then the output should be - """ - # 2020 - - ## October - - ### 2020-10-29 11:11 First entry. - - - ### 2020-10-29 11:11 Second entry. - - - ### 2020-10-29 11:13 Third entry. - - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - # | basic_dayone | @todo - - @skip - Scenario Outline: Exporting to XML - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --export xml" - Then the output should be a valid XML string - And "entries" node in the xml output should have 3 elements - And "tags" in the xml output should contain ["@ipsum", "@tagone", "@tagtwo", "@tagthree"] - And there should be 10 "tag" elements - - Examples: configs - | config | - # | basic_onefile | @todo - # | basic_encrypted | @todo - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario: Exporting to XML - Given we use the config "tags.yaml" - And we use the password "test" if prompted - When we run "jrnl --export xml" - Then the output should be a valid XML string - And "entries" node in the xml output should have 2 elements - And "tags" in the xml output should contain ["@idea", "@journal", "@dan"] - And there should be 7 "tag" elements - - Scenario Outline: Exporting tags - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --export tags" - Then the output should be - """ - @tagtwo : 2 - @tagone : 2 - @tagthree : 1 - @ipsum : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - - - Scenario Outline: Export fancy with small linewrap - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --config-override linewrap 35 --format fancy -3" - Then we should get no error - And the output should be 35 columns wide - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - @todo - Scenario Outline: Exporting fancy - # Needs better emoji support - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --export fancy" - Then the output should be - """ - ┎──────────────────────────────────────────────────────────────╮2020-08-29 11:11 - ┃ Entry the first. ╘═══════════════╕ - ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ - ┃ Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada │ - ┃ quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus │ - ┃ pellentesque │ - ┃ augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu │ - ┃ consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In │ - ┃ commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget │ - ┃ venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo. │ - ┃ │ - ┃ Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo │ - ┃ ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. │ - ┃ Suspendisse │ - ┃ potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas │ - ┃ eget │ - ┃ molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed │ - ┃ lectus │ - ┃ hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis │ - ┃ feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, │ - ┃ vestibulum │ - ┃ urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod │ - ┃ enim. │ - ┃ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget │ - ┃ velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac │ - ┃ porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per │ - ┃ conubia nostra, per inceptos himenaeos. │ - ┖──────────────────────────────────────────────────────────────────────────────┘ - ┎──────────────────────────────────────────────────────────────╮2020-08-31 14:32 - ┃ A second entry in what I hope to be a long series. ╘═══════════════╕ - ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ - ┃ Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis │ - ┃ leo │ - ┃ vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit │ - ┃ amet, │ - ┃ consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl │ - ┃ lorem, │ - ┃ vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum │ - ┃ lectus, │ - ┃ eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium │ - ┃ id │ - ┃ lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu, │ - ┃ egestas at efficitur et, ultrices vel est. Sed commodo et nibh non │ - ┃ elementum. │ - ┃ Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome. │ - ┃ │ - ┃ Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel │ - ┃ vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum │ - ┃ et │ - ┃ malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis │ - ┃ sem, │ - ┃ non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel │ - ┃ ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a │ - ┃ commodo │ - ┃ eros. │ - ┃ │ - ┃ Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non │ - ┃ tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor. │ - ┃ Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum │ - ┃ quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum │ - ┃ interdum. Integer id justo dui. Integer eu tellus in turpis bibendum │ - ┃ blandit. │ - ┃ Quisque auctor lacinia consectetur. │ - ┖──────────────────────────────────────────────────────────────────────────────┘ - ┎──────────────────────────────────────────────────────────────╮2020-09-24 09:14 - ┃ The third entry finally after weeks without writing. ╘═══════════════╕ - ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ - ┃ I'm so excited about emojis. 💯 🎶 💩 │ - ┃ │ - ┃ Donec semper pellentesque iaculis. Nullam cursus et justo sit amet │ - ┃ venenatis. │ - ┃ Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. │ - ┃ Nulla │ - ┃ eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis │ - ┃ dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh │ - ┃ malesuada. │ - ┃ Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis │ - ┃ vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan │ - ┃ justo. │ - ┃ Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at │ - ┃ ante eget fringilla. @tagthree and also @tagone │ - ┖──────────────────────────────────────────────────────────────────────────────┘ - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - @skip_win - Scenario Outline: Export to yaml - Given we use the config ".yaml" - And we use the password "test" if prompted - And we create a cache directory - When we run "jrnl --export yaml -o {cache_dir}" - Then the cache should contain the files - """ - 2020-08-29_entry-the-first.md - 2020-08-31_a-second-entry-in-what-i-hope-to-be-a-long-series.md - 2020-09-24_the-third-entry-finally-after-weeks-without-writing.md - """ - And the content of file "2020-08-29_entry-the-first.md" in the cache should be - """ - --- - title: Entry the first. - date: 2020-08-29 11:11 - starred: False - tags: tagone, ipsum, tagtwo - body: | - Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada - quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque - augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu - consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In - commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget - venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo. - - Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo - ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse - potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget - molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus - hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis - feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum - urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget - velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac - porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per - conubia nostra, per inceptos himenaeos. - ... - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - # | basic_dayone | - - @skip_win # @todo YAML exporter does not correctly export emoji on Windows - Scenario Outline: Add a blank line to YAML export if there isn't one already - # https://github.com/jrnl-org/jrnl/issues/768 - # https://github.com/jrnl-org/jrnl/issues/881 - Given we use the config ".yaml" - And we use the password "test" if prompted - And we create a cache directory - When we run "jrnl --export yaml -o {cache_dir}" - Then the cache should contain the files - """ - 2020-08-29_entry-the-first.md - 2020-08-31_a-second-entry-in-what-i-hope-to-be-a-long-series.md - 2020-09-24_the-third-entry-finally-after-weeks-without-writing.md - """ - And the content of file "2020-09-24_the-third-entry-finally-after-weeks-without-writing.md" in the cache should be - """ - --- - title: The third entry finally after weeks without writing. - date: 2020-09-24 09:14 - starred: False - tags: tagone, tagthree - body: | - I'm so excited about emojis. 💯 🎶 💩 - - Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis. - Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla - eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis - dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada. - Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis - vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo. - Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at - ante eget fringilla. @tagthree and also @tagone - ... - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - # | basic_dayone | @todo - - Scenario: Empty DayOne entry bodies should not error - # https://github.com/jrnl-org/jrnl/issues/780 - Given we use the config "bug780.yaml" - When we run "jrnl --short" - Then we should get no error - - Scenario Outline: --short displays the short version of entries (only the title) - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -on 2020-08-31 --short" - Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series." - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: -s displays the short version of entries (only the title) - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -on 2020-08-31 -s" - Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series." - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario: Markdown Support from config file - Given we use the config "format_md.yaml" - When we run "jrnl -n 1" - Then the output should be - """ - # 2013 - - ## June - - ### 2013-06-10 15:40 Life is good. - - But I'm better. - """ - - Scenario: Text Formatter from config file - Given we use the config "format_text.yaml" - When we run "jrnl -n 1" - Then the output should be - """ - [2013-06-10 15:40] Life is good. - But I'm better. - """ - - Scenario Outline: Exporting entries with Cyrillic characters to directory should not fail - Given we use the config ".yaml" - And we use the password "test" if prompted - And we create a cache directory - When we run "jrnl 2020-11-21: Первая" - When we run "jrnl --format md --file {cache_dir} -on 2020-11-21" - Then the cache should contain the files - """ - 2020-11-21_первая.md - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Export date counts - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl 2020-08-31 01:01: Hi." - And we run "jrnl --format dates" - Then the output should be - """ - 2020-08-29, 1 - 2020-08-31, 2 - 2020-09-24, 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | diff --git a/features/import.feature b/features/import.feature deleted file mode 100644 index 63b042fc..00000000 --- a/features/import.feature +++ /dev/null @@ -1,93 +0,0 @@ -Feature: Importing data - - Scenario Outline: --import allows new entry from stdin - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --import" and pipe "[2020-07-05 15:00] Observe and import." - Then we flush the output - When we run "jrnl -c import" - Then the output should contain "Observe and import" - - Examples: Configs - | config | - | basic_onefile | - | basic_encrypted | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: --import allows new large entry from stdin - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --import" and pipe - """ - [2020-07-05 15:00] Observe and import. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada quis - est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque augue - et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu consequat. - Aenean ante ex, elementum ut interdum et, mattis eget lacus. In commodo nulla nec - tellus placerat, sed ultricies metus bibendum. Duis eget venenatis erat. In at - dolor dui end of entry. - """ - Then we flush the output - When we run "jrnl -on 2020-07-05" - Then the output should contain "2020-07-05 15:00 Observe and import." - And the output should contain "Lorem ipsum" - And the output should contain "end of entry." - - Examples: Configs - | config | - | basic_onefile | - | basic_encrypted | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario Outline: --import allows multiple new entries from stdin - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl --import" and pipe - """ - [2020-07-05 15:00] Observe and import. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. - - [2020-07-05 15:01] Twice as nice. - Sed dignissim sed nisl eu consequat. - """ - Then we flush the output - When we run "jrnl -on 2020-07-05" - Then the output should contain "2020-07-05 15:00 Observe and import." - And the output should contain "Lorem ipsum" - And the output should contain "2020-07-05 15:01 Twice as nice." - And the output should contain "Sed dignissim" - - Examples: Configs - | config | - | basic_onefile | - | basic_encrypted | - # | basic_folder | @todo - # | basic_dayone | @todo - - Scenario: --import allows import new entries from file - Given we use the config "simple.yaml" - Then the journal should contain "My first entry." - And the journal should contain "Life is good." - But the journal should not contain "I have an @idea" - And the journal should not contain "I met with" - When we run "jrnl --import --file features/journals/tags.journal" - Then the journal should contain "My first entry." - And the journal should contain "Life is good." - And the journal should contain "PROFIT!" - - Scenario: --import prioritizes --file over pipe data if both are given - Given we use the config "simple.yaml" - Then the journal should contain "My first entry." - And the journal should contain "Life is good." - But the journal should not contain "I have an @idea" - And the journal should not contain "I met with" - When we run "jrnl --import --file features/journals/tags.journal" and pipe - """ - [2020-07-05 15:00] I should not exist! - """ - Then the journal should contain "My first entry." - And the journal should contain "PROFIT!" - But the journal should not contain "I should not exist!" - diff --git a/features/multiple_journals.feature b/features/multiple_journals.feature deleted file mode 100644 index 222be100..00000000 --- a/features/multiple_journals.feature +++ /dev/null @@ -1,65 +0,0 @@ -Feature: Multiple journals - - Scenario: Loading a config with two journals - Given we use the config "multiple.yaml" - Then journal "default" should have 2 entries - And journal "work" should have 0 entries - - Scenario: Write to default config by default - Given we use the config "multiple.yaml" - When we run "jrnl this goes to default" - Then journal "default" should have 3 entries - And journal "work" should have 0 entries - - Scenario: Write to specified journal - Given we use the config "multiple.yaml" - When we run "jrnl work a long day in the office" - Then journal "default" should have 2 entries - And journal "work" should have 1 entry - - Scenario: Tell user which journal was used - Given we use the config "multiple.yaml" - When we run "jrnl work a long day in the office" - Then we should see the message "Entry added to work journal" - - Scenario: Write to specified journal with a timestamp - Given we use the config "multiple.yaml" - When we run "jrnl work 23 july 2012: a long day in the office" - Then journal "default" should have 2 entries - And journal "work" should have 1 entry - And journal "work" should contain "2012-07-23" - - Scenario: Write to specified journal without a timestamp but with colon - Given we use the config "multiple.yaml" - When we run "jrnl work : a long day in the office" - Then journal "default" should have 2 entries - And journal "work" should have 1 entry - And journal "work" should contain "a long day in the office" - - Scenario: Write to specified journal without a timestamp but with colon - Given we use the config "multiple.yaml" - When we run "jrnl work: a long day in the office" - Then journal "default" should have 2 entries - And journal "work" should have 1 entry - And journal "work" should contain "a long day in the office" - - Scenario: Create new journals as required - Given we use the config "multiple.yaml" - Then journal "ideas" should not exist - When we run "jrnl ideas 23 july 2012: sell my junk on ebay and make lots of money" - Then journal "ideas" should have 1 entry - - Scenario: Don't crash if no default journal is specified - Given we use the config "bug343.yaml" - When we run "jrnl a long day in the office" - Then we should see the message "No default journal configured" - - Scenario: Don't crash if no file exists for a configured encrypted journal - Given we use the config "multiple.yaml" - When we run "jrnl new_encrypted Adding first entry" and enter - """ - these three eyes - these three eyes - n - """ - Then we should see the message "Encrypted journal 'new_encrypted' created" diff --git a/features/overrides.feature b/features/overrides.feature deleted file mode 100644 index e0cdd9f0..00000000 --- a/features/overrides.feature +++ /dev/null @@ -1,98 +0,0 @@ -Feature: Implementing Runtime Overrides for Select Configuration Keys - - Scenario: Override configured editor with built-in input === editor:'' - Given we use the config "basic_encrypted.yaml" - And we use the password "test" if prompted - When we run "jrnl --config-override editor ''" - Then the stdin prompt should have been called - - Scenario: Postconfig commands with overrides - Given We use the config "basic_encrypted.yaml" - And we use the password "test" if prompted - When we run "jrnl --decrypt --config-override highlight false --config-override editor nano" - Then the config should have "highlight" set to "bool:false" - And no editor should have been called - - Scenario: Override configured linewrap with a value of 23 - Given we use the config "simple.yaml" - And we use the password "test" if prompted - When we run "jrnl -2 --config-override linewrap 23 --format fancy" - Then the output should be - - """ - ┎─────╮2013-06-09 15:39 - ┃ My ╘═══════════════╕ - ┃ fir st ent ry. │ - ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ - ┃ Everything is │ - ┃ alright │ - ┖─────────────────────┘ - ┎─────╮2013-06-10 15:40 - ┃ Lif ╘═══════════════╕ - ┃ e is goo d. │ - ┠╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ - ┃ But I'm better. │ - ┖─────────────────────┘ - """ - - Scenario: Override color selections with runtime overrides - Given we use the config "basic_encrypted.yaml" - And we use the password "test" if prompted - When we run "jrnl -1 --config-override colors.body blue" - Then the config should have "colors.body" set to "blue" - - Scenario: Apply multiple config overrides - Given we use the config "basic_encrypted.yaml" - And we use the password "test" if prompted - When we run "jrnl -1 --config-override colors.body green --config-override editor 'nano'" - Then the config should have "colors.body" set to "green" - And the config should have "editor" set to "nano" - - - Scenario Outline: Override configured editor - Given we use the config "basic_encrypted.yaml" - And we use the password "test" if prompted - When we run "jrnl --config-override editor ''" - Then the editor should have been called - Examples: Editor Commands - | editor | - | nano | - | vi -c startinsert | - | code -w | - - Scenario: Override default journal - Given we use the config "basic_dayone.yaml" - And we use the password "test" if prompted - When we run "jrnl --debug --config-override journals.default features/journals/simple.journal 20 Mar 2000: The rain in Spain comes from clouds" - Then we should get no error - And we should see the message "Entry added" - When we run "jrnl -3 --debug --config-override journals.default features/journals/simple.journal" - Then the output should be - """ - 2000-03-20 09:00 The rain in Spain comes from clouds - - 2013-06-09 15:39 My first entry. - | Everything is alright - - 2013-06-10 15:40 Life is good. - | But I'm better. - """ - - - Scenario: Make an entry into an overridden journal - Given we use the config "basic_dayone.yaml" - And we use the password "test" if prompted - When we run "jrnl --config-override journals.temp features/journals/simple.journal temp Sep 06 1969: @say Ni" - Then we should get no error - And we should see the message "Entry added" - When we run "jrnl --config-override journals.temp features/journals/simple.journal temp -3" - Then the output should be - """ - 1969-09-06 09:00 @say Ni - - 2013-06-09 15:39 My first entry. - | Everything is alright - - 2013-06-10 15:40 Life is good. - | But I'm better. - """ diff --git a/features/password.feature b/features/password.feature deleted file mode 100644 index 332ba86e..00000000 --- a/features/password.feature +++ /dev/null @@ -1,116 +0,0 @@ -Feature: Using the installed keyring - - Scenario: Storing a password in keyring - Given we use the config "multiple.yaml" - And we have a keyring - When we run "jrnl simple --encrypt" and enter - """ - sabertooth - sabertooth - y - """ - Then the config for journal "simple" should have "encrypt" set to "bool:True" - When we run "jrnl simple -n 1" - Then the output should contain "2013-06-10 15:40 Life is good" - - Scenario: Encrypt journal with no keyring backend and do not store in keyring - Given we use the config "simple.yaml" - And we do not have a keyring - When we run "jrnl test entry" - And we run "jrnl --encrypt" and enter - """ - password - password - n - """ - Then we should get no error - And we should not see the message "Failed to retrieve keyring" - - Scenario: Encrypt journal with no keyring backend and do store in keyring - Given we use the config "simple.yaml" - And we do not have a keyring - When we run "jrnl test entry" - And we run "jrnl --encrypt" and enter - """ - password - password - y - """ - Then we should get no error - And we should not see the message "Failed to retrieve keyring" - # @todo add step to check contents of keyring - - @todo - Scenario: Open an encrypted journal with wrong password in keyring - # This should ask the user for the password after the keyring fails - - @todo - Scenario: Decrypt journal with password in keyring - - @todo - Scenario: Decrypt journal without a keyring - - Scenario: Encrypt journal when keyring exists but fails - Given we use the config "simple.yaml" - And we have a failed keyring - When we run "jrnl --encrypt" and enter - """ - this password will not be saved in keyring - this password will not be saved in keyring - y - """ - Then we should see the message "Failed to retrieve keyring" - And we should get no error - And we should be prompted for a password - And the config for journal "default" should have "encrypt" set to "bool:True" - - Scenario: Decrypt journal when keyring exists but fails - Given we use the config "encrypted.yaml" - And we have a failed keyring - When we run "jrnl --decrypt" and enter "bad doggie no biscuit" - Then we should see the message "Failed to retrieve keyring" - And we should get no error - And we should be prompted for a password - And we should see the message "Journal decrypted" - And the config for journal "default" should have "encrypt" set to "bool:False" - And the journal should have 2 entries - - Scenario: Open encrypted journal when keyring exists but fails - # This should ask the user for the password after the keyring fails - Given we use the config "encrypted.yaml" - And we have a failed keyring - When we run "jrnl -n 1" and enter "bad doggie no biscuit" - Then we should see the message "Failed to retrieve keyring" - And we should get no error - And we should be prompted for a password - And the output should contain "2013-06-10 15:40 Life is good" - - Scenario: Mistyping your password - Given we use the config "simple.yaml" - When we run "jrnl --encrypt" and enter - """ - swordfish - sordfish - """ - Then we should be prompted for a password - And we should see the message "Passwords did not match" - And the config for journal "default" should not have "encrypt" set - And the journal should have 2 entries - - Scenario: Mistyping your password, then getting it right - Given we use the config "simple.yaml" - When we run "jrnl --encrypt" and enter - """ - swordfish - sordfish - swordfish - swordfish - n - """ - Then we should be prompted for a password - And we should see the message "Passwords did not match" - And we should see the message "Journal encrypted" - And the config for journal "default" should have "encrypt" set to "bool:True" - When we run "jrnl -n 1" and enter "swordfish" - Then we should be prompted for a password - And the output should contain "2013-06-10 15:40 Life is good" diff --git a/features/search.feature b/features/search.feature deleted file mode 100644 index 22351b7e..00000000 --- a/features/search.feature +++ /dev/null @@ -1,318 +0,0 @@ -Feature: Searching in a journal - - Scenario Outline: Displaying entries using -on today should display entries created today - Given we use the config ".yaml" - When we run "jrnl today: Adding an entry right now." - Then we should see the message "Entry added" - When we run "jrnl -on today" - Then the output should contain "Adding an entry right now." - But the output should not contain "Everything is alright" - And the output should not contain "Life is good" - - Examples: configs - | config | - | simple | - | empty_folder | - | dayone | - - Scenario Outline: Displaying entries using -from day should display correct entries - Given we use the config ".yaml" - When we run "jrnl yesterday: This thing happened yesterday" - Then we should see the message "Entry added" - When we run "jrnl today at 11:59pm: Adding an entry right now." - Then we should see the message "Entry added" - When we run "jrnl tomorrow: A future entry." - Then we should see the message "Entry added" - When we run "jrnl -from today" - Then the output should contain "Adding an entry right now." - And the output should contain "A future entry." - And the output should not contain "This thing happened yesterday" - - Examples: configs - | config | - | simple | - | empty_folder | - | dayone | - - Scenario Outline: Displaying entries using -from and -to day should display correct entries - Given we use the config ".yaml" - When we run "jrnl yesterday: This thing happened yesterday" - Then we should see the message "Entry added" - When we run "jrnl today at 11:59pm: Adding an entry right now." - Then we should see the message "Entry added" - When we run "jrnl tomorrow: A future entry." - Then we should see the message "Entry added" - When we run "jrnl -from yesterday -to today" - Then the output should contain "This thing happened yesterday" - And the output should contain "Adding an entry right now." - And the output should not contain "A future entry." - - Examples: configs - | config | - | simple | - | empty_folder | - | dayone | - - Scenario Outline: Searching for a string - Given we use the config ".yaml" - When we run "jrnl -contains first --short" - Then we should get no error - And the output should be - """ - 2020-08-29 11:11 Entry the first. - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching for a string within tag results - Given we use the config ".yaml" - When we run "jrnl @tagone -contains maybe" - Then we should get no error - And the output should contain "maybe" - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching for a string within AND tag results - Given we use the config ".yaml" - When we run "jrnl -and @tagone @tagtwo -contains maybe" - Then we should get no error - And the output should contain "maybe" - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching for a string within NOT tag results - Given we use the config ".yaml" - When we run "jrnl -not @tagone -contains lonesome" - Then we should get no error - And the output should contain "lonesome" - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching for dates - Given we use the config ".yaml" - When we run "jrnl -on 2020-08-31 --short" - Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series." - Then we flush the output - When we run "jrnl -on 'august 31 2020' --short" - Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series." - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario: Out of order entries to a Folder journal should be listed in date order - Given we use the config "empty_folder.yaml" - When we run "jrnl 3/7/2014 4:37pm: Second entry of journal." - Then we should see the message "Entry added" - When we run "jrnl 23 July 2013: Testing folder journal." - Then we should see the message "Entry added" - When we run "jrnl -2" - Then the output should be - """ - 2013-07-23 09:00 Testing folder journal. - - 2014-03-07 16:37 Second entry of journal. - """ - - Scenario Outline: Searching for all tags should show counts of each tag - Given we use the config ".yaml" - When we run "jrnl --tags" - Then we should get no error - And the output should be - """ - @tagtwo : 2 - @tagone : 2 - @tagthree : 1 - @ipsum : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Filtering journals should also filter tags - Given we use the config ".yaml" - When we run "jrnl -from 'september 2020' --tags" - Then we should get no error - And the output should be - """ - @tagthree : 1 - @tagone : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Excluding a tag should filter out all entries with that tag - Given we use the config ".yaml" - When we run "jrnl --tags -not @tagtwo" - Then the output should be - """ - @tagthree : 1 - @tagone : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Excluding multiple tags should filter out all entries with those tags - Given we use the config ".yaml" - When we run "jrnl --tags -not @tagone -not @tagthree" - Then the output should be - """ - @tagtwo : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario: DayOne tag searching should work with tags containing a mixture of upper and lower case. - # https://github.com/jrnl-org/jrnl/issues/354 - Given we use the config "dayone.yaml" - When we run "jrnl @plAy" - Then the output should contain "2013-05-17 11:39 This entry has tags!" - - Scenario: Loading a sample journal - Given we use the config "simple.yaml" - When we run "jrnl -2" - Then we should get no error - And the output should be - """ - 2013-06-09 15:39 My first entry. - | Everything is alright - - 2013-06-10 15:40 Life is good. - | But I'm better. - """ - - Scenario Outline: Searching by month - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -month 9 --short" - Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing." - And we flush the output - When we run "jrnl -month Sept --short" - Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing." - And we flush the output - When we run "jrnl -month September --short" - Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing." - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching by day - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -day 31 --short" - Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series." - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching by year - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl 2019-01-01 01:01: I like this year." - And we run "jrnl -year 2019 --short" - Then the output should be "2019-01-01 01:01 I like this year." - And we flush the output - When we run "jrnl -year 19 --short" - Then the output should be "2019-01-01 01:01 I like this year." - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Combining month, day, and year search terms - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl -month 08 -day 29 --short" - Then the output should be "2020-08-29 11:11 Entry the first." - And we flush the output - When we run "jrnl -day 29 -year 2020 --short" - Then the output should be "2020-08-29 11:11 Entry the first." - And we flush the output - When we run "jrnl -month 09 -year 2020 --short" - Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing." - And we flush the output - When we run "jrnl -month 08 -day 29 -year 2020 --short" - Then the output should be "2020-08-29 11:11 Entry the first." - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Searching today in history - Given we use the config ".yaml" - And we use the password "test" if prompted - And we set current date and time to "2020-08-31 14:32" - When we run "jrnl 2019-08-31 01:01: Hi, from last year." - And we run "jrnl -today-in-history --short" - Then the output should be - """ - 2019-08-31 01:01 Hi, from last year. - 2020-08-31 14:32 A second entry in what I hope to be a long series. - """ - - Examples: configs - | config | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario: Loading a DayOne Journal - Given we use the config "dayone.yaml" - When we run "jrnl -from 'feb 2013'" - Then we should get no error - And the output should be - """ - 2013-05-17 11:39 This entry has tags! - - 2013-06-17 20:38 This entry has a location. - - 2013-07-17 11:38 This entry is starred! - """ diff --git a/features/star.feature b/features/star.feature deleted file mode 100644 index f0188056..00000000 --- a/features/star.feature +++ /dev/null @@ -1,35 +0,0 @@ -Feature: Starring entries - - Scenario Outline: Starring an entry will mark it in the journal file - Given we use the config ".yaml" - When we run "jrnl 20 july 2013 *: Best day of my life!" - Then we should see the message "Entry added" - When we run "jrnl -on 2013-07-20 -starred" - Then the output should contain "2013-07-20 09:00 Best day of my life!" - - Examples: configs - | config_file | - | simple | - | empty_folder | - | dayone | - - Scenario Outline: Filtering by starred entries will show only starred entries - Given we use the config ".yaml" - When we run "jrnl -starred" - Then the output should be empty - When we run "jrnl 20 july 2013 *: Best day of my life!" - When we run "jrnl -starred" - Then the output should be "2013-07-20 09:00 Best day of my life!" - - Examples: configs - | config_file | - | simple | - | empty_folder | - | dayone_empty | - - Scenario: Starring an entry will mark it in an encrypted journal - Given we use the config "encrypted.yaml" - When we run "jrnl 20 july 2013 *: Best day of my life!" and enter "bad doggie no biscuit" - Then we should see the message "Entry added" - When we run "jrnl -on 2013-07-20 -starred" and enter "bad doggie no biscuit" - Then the output should contain "2013-07-20 09:00 Best day of my life!" diff --git a/features/steps/core.py b/features/steps/core.py deleted file mode 100644 index 2ad5bcc4..00000000 --- a/features/steps/core.py +++ /dev/null @@ -1,687 +0,0 @@ -# Copyright (C) 2012-2021 jrnl contributors -# License: https://www.gnu.org/licenses/gpl-3.0.html - -import ast -from collections import defaultdict -from jrnl.args import parse_args -import os -from pathlib import Path -import re -import time -from unittest.mock import patch - -from behave import given -from behave import then -from behave import when -import keyring - -import toml -import yaml -from yaml.loader import SafeLoader - - -import jrnl.time -from jrnl import Journal -from jrnl import __version__ -from jrnl import plugins -from jrnl.cli import cli -from jrnl.config import load_config -from jrnl.os_compat import split_args -from jrnl.override import apply_overrides, _recursively_apply - -try: - import parsedatetime.parsedatetime_consts as pdt -except ImportError: - import parsedatetime as pdt - -consts = pdt.Constants(usePyICU=False) -consts.DOWParseStyle = -1 # Prefers past weekdays -CALENDAR = pdt.Calendar(consts) - - -class TestKeyring(keyring.backend.KeyringBackend): - """A test keyring that just stores its values in a hash""" - - priority = 1 - keys = defaultdict(dict) - - def set_password(self, servicename, username, password): - self.keys[servicename][username] = password - - def get_password(self, servicename, username): - return self.keys[servicename].get(username) - - def delete_password(self, servicename, username): - self.keys[servicename][username] = None - - -class NoKeyring(keyring.backend.KeyringBackend): - """A keyring that simulated an environment with no keyring backend.""" - - priority = 2 - keys = defaultdict(dict) - - def set_password(self, servicename, username, password): - raise keyring.errors.NoKeyringError - - def get_password(self, servicename, username): - raise keyring.errors.NoKeyringError - - def delete_password(self, servicename, username): - raise keyring.errors.NoKeyringError - - -class FailedKeyring(keyring.backend.KeyringBackend): - """ - A keyring that cannot be retrieved. - """ - - priority = 2 - - def set_password(self, servicename, username, password): - raise keyring.errors.KeyringError - - def get_password(self, servicename, username): - raise keyring.errors.KeyringError - - def delete_password(self, servicename, username): - raise keyring.errors.KeyringError - - -# set a default keyring -keyring.set_keyring(TestKeyring()) - - -def read_journal(context, journal_name="default"): - configuration = load_config(context.config_path) - with open(configuration["journals"][journal_name]) as journal_file: - journal = journal_file.read() - return journal - - -def open_journal(context, journal_name="default"): - configuration = load_config(context.config_path) - journal_conf = configuration["journals"][journal_name] - - # We can override the default config on a by-journal basis - if type(journal_conf) is dict: - configuration.update(journal_conf) - # But also just give them a string to point to the journal file - else: - configuration["journal"] = journal_conf - - return Journal.open_journal(journal_name, configuration) - - -def read_value_from_string(string): - if string[0] == "{": - # Handle value being a dictionary - return ast.literal_eval(string) - - # Takes strings like "bool:true" or "int:32" and coerces them into proper type - string_parts = string.split(":") - if len(string_parts) > 1: - type = string_parts[0] - value = string_parts[1:][0] # rest of the text - value = {"bool": lambda v: v.lower() == "true", "int": int, "str": str}[type]( - value - ) - else: - value = string_parts[0] - return value - - -@given('we use the config "{config_file}"') -def set_config(context, config_file): - full_path = os.path.join("features/configs", config_file) - - context.config_path = os.path.abspath(full_path) - - if config_file.endswith("yaml") and os.path.exists(full_path): - # Add jrnl version to file for 2.x journals - with open(context.config_path, "a") as cf: - cf.write("version: {}".format(__version__)) - - -@given('we use the password "{password}" if prompted') -def use_password_forever(context, password): - context.password = password - - -@given('we use the password "{password}" {num:d} times if prompted') -def use_password(context, password, num=1): - context.password = iter([password] * num) - - -@given("we have a keyring") -@given("we have a {type} keyring") -def set_keyring(context, type=""): - if type == "failed": - keyring.set_keyring(FailedKeyring()) - else: - keyring.set_keyring(TestKeyring()) - - -@given("we do not have a keyring") -def disable_keyring(context): - keyring.core.set_keyring(NoKeyring()) - - -@given('we set current date and time to "{dt}"') -def set_datetime(context, dt): - context.now = dt - - -@when('we change directory to "{path}"') -def move_up_dir(context, path): - os.chdir(path) - - -@when("we open the editor and {method}") -@when('we open the editor and {method} "{text}"') -@when("we open the editor and {method} nothing") -@when("we open the editor and {method} nothing") -def open_editor_and_enter(context, method, text=""): - text = text or context.text or "" - - if method == "enter": - file_method = "w+" - elif method == "append": - file_method = "a" - else: - file_method = "r+" - - def _mock_editor(command): - context.editor_command = command - tmpfile = command[-1] - with open(tmpfile, file_method) as f: - f.write(text) - - return tmpfile - - if "password" in context: - password = context.password - else: - password = "" - - # fmt: off - # see: https://github.com/psf/black/issues/664 - with \ - patch("subprocess.call", side_effect=_mock_editor) as mock_editor, \ - patch("getpass.getpass", side_effect=_mock_getpass(password)) as mock_getpass, \ - patch("sys.stdin.isatty", return_value=True), \ - patch("jrnl.time.parse", side_effect=_mock_time_parse(context)), \ - patch("jrnl.config.get_config_path", side_effect=lambda: context.config_path), \ - patch("jrnl.install.get_config_path", side_effect=lambda: context.config_path) \ - : - context.editor = mock_editor - context.getpass = mock_getpass - try: - cli(["--edit"]) - context.exit_status = 0 - except SystemExit as e: - context.exit_status = e.code - - # fmt: on - - -@then("the editor should have been called") -@then("the editor should have been called with {num} arguments") -def count_editor_args(context, num=None): - assert context.editor.called - - if isinstance(num, int): - assert len(context.editor_command) == int(num) - - -@then("the editor should not have been called") -def no_editor_called(context, num=None): - assert "editor" not in context or not context.editor.called - - -@then('one editor argument should be "{arg}"') -def contains_editor_arg(context, arg): - args = context.editor_command - assert ( - arg in args and args.count(arg) == 1 - ), f"\narg not in args exactly 1 time:\n{arg}\n{str(args)}" - - -@then('one editor argument should match "{regex}"') -def matches_editor_arg(context, regex): - args = context.editor_command - matches = list(filter(lambda x: re.search(regex, x), args)) - assert ( - len(matches) == 1 - ), f"\nRegex didn't match exactly 1 time:\n{regex}\n{str(args)}" - - -@then("the editor file content should {method}") -@then("the editor file content should {method} empty") -@then('the editor file content should {method} "{text}"') -def contains_editor_file(context, method, text=""): - text = text or context.text or "" - content = context.editor_file.get("content") - format = f'\n"""\n{content}\n"""\n' - if method == "be": - assert content == text, format - elif method == "contain": - assert text in content, format - else: - assert False, f"Method '{method}' not supported" - - -@then('the temporary filename suffix should be "{suffix}"') -def extension_editor_file(context, suffix): - filename = Path(context.editor_file["name"]).name - delimiter = "-" if "-" in filename else "." - filename_suffix = delimiter + filename.split(delimiter)[-1] - assert filename_suffix == suffix - - -def _mock_getpass(inputs): - def prompt_return(prompt=""): - if type(inputs) == str: - return inputs - try: - return next(inputs) - except StopIteration: - raise KeyboardInterrupt - - return prompt_return - - -def _mock_input(inputs): - def prompt_return(prompt=""): - try: - val = next(inputs) - print(prompt, val) - return val - except StopIteration: - raise KeyboardInterrupt - - return prompt_return - - -def _mock_time_parse(context): - original_parse = jrnl.time.parse - if "now" not in context: - return original_parse - - def wrapper(input, *args, **kwargs): - input = context.now if input == "now" else input - return original_parse(input, *args, **kwargs) - - return wrapper - - -@when('we run "{command}" and enter') -@when('we run "{command}" and enter nothing') -@when('we run "{command}" and enter "{inputs}"') -def run_with_input(context, command, inputs=""): - # create an iterator through all inputs. These inputs will be fed one by one - # to the mocked calls for 'input()', 'util.getpass()' and 'sys.stdin.read()' - if context.text: - text = iter(context.text.split("\n")) - else: - text = iter([inputs]) - - args = split_args(command)[1:] - context.args = args - - def _mock_editor(command): - context.editor_command = command - tmpfile = command[-1] - with open(tmpfile, "r") as editor_file: - file_content = editor_file.read() - context.editor_file = {"name": tmpfile, "content": file_content} - Path(tmpfile).touch() - - if "password" in context: - password = context.password - else: - password = text - - # fmt: off - # see: https://github.com/psf/black/issues/664 - with \ - patch("builtins.input", side_effect=_mock_input(text)) as mock_input, \ - patch("getpass.getpass", side_effect=_mock_getpass(password)) as mock_getpass, \ - patch("sys.stdin.read", side_effect=text) as mock_read, \ - patch("subprocess.call", side_effect=_mock_editor) as mock_editor, \ - patch("jrnl.time.parse", side_effect=_mock_time_parse(context)), \ - patch("jrnl.config.get_config_path", side_effect=lambda: context.config_path), \ - patch("jrnl.install.get_config_path", side_effect=lambda: context.config_path) \ - : - try: - cli(args or []) - context.exit_status = 0 - except SystemExit as e: - context.exit_status = e.code - - # put mocks into context so they can be checked later in "then" statements - context.editor = mock_editor - context.input = mock_input - context.getpass = mock_getpass - context.read = mock_read - context.iter_text = text - - context.execute_steps(''' - Then all input was used - And at least one input method was called - ''') - - # fmt: on - - -@then("at least one input method was called") -def inputs_were_called(context): - assert ( - context.input.called - or context.getpass.called - or context.read.called - or context.editor.called - ) - - -@then("we should be prompted for a password") -def password_was_called(context): - assert context.getpass.called - - -@then("we should not be prompted for a password") -def password_was_not_called(context): - assert not context.getpass.called - - -@then("all input was used") -def all_input_was_used(context): - # all inputs were used (ignore if empty string) - for temp in context.iter_text: - assert "" == temp, "Not all inputs were consumed" - - -@when('we run "{command}"') -@when('we run "{command}" and pipe') -@when('we run "{command}" and pipe "{text}"') -def run(context, command, text=""): - text = text or context.text or "" - - if "config_path" in context and context.config_path is not None: - with open(context.config_path) as f: - context.jrnl_config = yaml.load(f, Loader=yaml.SafeLoader) - else: - context.jrnl_config = None - - if "cache_dir" in context and context.cache_dir is not None: - cache_dir = os.path.join("features", "cache", context.cache_dir) - command = command.format(cache_dir=cache_dir) - if "config_path" in context and context.config_path is not None: - with open(context.config_path, "r") as f: - cfg = yaml.load(f, Loader=SafeLoader) - context.jrnl_config = cfg - - args = split_args(command) - context.args = args[1:] - - def _mock_editor(command): - context.editor_command = command - tmpfile = command[-1] - with open(tmpfile, "r") as editor_file: - file_content = editor_file.read() - context.editor_file = {"name": tmpfile, "content": file_content} - Path(tmpfile).touch() - - if "password" in context: - password = context.password - else: - password = iter(text) - - try: - # fmt: off - # see: https://github.com/psf/black/issues/664 - with \ - patch("sys.argv", args), \ - patch("getpass.getpass", side_effect=_mock_getpass(password)) as mock_getpass, \ - patch("subprocess.call", side_effect=_mock_editor) as mock_editor, \ - patch("sys.stdin.read", side_effect=lambda: text), \ - patch("jrnl.time.parse", side_effect=_mock_time_parse(context)), \ - patch("jrnl.config.get_config_path", side_effect=lambda: context.config_path), \ - patch("jrnl.install.get_config_path", side_effect=lambda: context.config_path) \ - : - context.editor = mock_editor - context.getpass = mock_getpass - cli(args[1:]) - context.exit_status = 0 - # fmt: on - except SystemExit as e: - context.exit_status = e.code - - -@given('we load template "{filename}"') -def load_template(context, filename): - full_path = os.path.join("features/data/templates", filename) - exporter = plugins.template_exporter.__exporter_from_file(full_path) - plugins.__exporter_types[exporter.names[0]] = exporter - - -@when('we set the keyring password of "{journal}" to "{password}"') -def set_keyring_password(context, journal, password): - keyring.set_password("jrnl", journal, password) - - -@then("we should get an error") -def has_error(context): - assert context.exit_status != 0, context.exit_status - - -@then("we should get no error") -def no_error(context): - assert context.exit_status == 0, context.exit_status - - -@then("we flush the output") -def flush_stdout(context): - context.stdout_capture.truncate(0) - context.stdout_capture.seek(0) - - -@then("we flush the error output") -def flush_stderr(context): - context.stderr_capture.truncate(0) - context.stderr_capture.seek(0) - - -@then("we flush all the output") -def flush_all_output(context): - context.execute_steps( - """ - Then we flush the output - Then we flush the error output - """ - ) - - -@then("the output should be") -@then("the output should be empty") -@then('the output should be "{text}"') -def check_output(context, text=None): - text = (text or context.text or "").strip().splitlines() - out = context.stdout_capture.getvalue().strip().splitlines() - assert len(text) == len(out), "Output has {} lines (expected: {})".format( - len(out), len(text) - ) - for line_text, line_out in zip(text, out): - assert line_text.strip() == line_out.strip(), [ - line_text.strip(), - line_out.strip(), - ] - - -@then('the output should contain "{text}" in the local time') -def check_output_time_inline(context, text): - out = context.stdout_capture.getvalue() - date, flag = CALENDAR.parse(text) - output_date = time.strftime("%Y-%m-%d %H:%M", date) - assert output_date in out, output_date - - -@then("the output should contain pyproject.toml version") -def check_output_version_inline(context): - out = context.stdout_capture.getvalue() - pyproject = (Path(__file__) / ".." / ".." / ".." / "pyproject.toml").resolve() - pyproject_contents = toml.load(pyproject) - pyproject_version = pyproject_contents["tool"]["poetry"]["version"] - assert pyproject_version in out, pyproject_version - - -@then("the output should contain") -@then('the output should contain "{text}"') -@then('the output should contain "{text}" or "{text2}"') -def check_output_inline(context, text=None, text2=None): - text = text or context.text - out = context.stdout_capture.getvalue() - assert (text and text in out) or (text2 and text2 in out) - - -@then("the error output should contain") -@then('the error output should contain "{text}"') -@then('the error output should contain "{text}" or "{text2}"') -def check_error_output_inline(context, text=None, text2=None): - text = text or context.text - out = context.stderr_capture.getvalue() - assert (text and text in out) or (text2 and text2 in out) - - -@then('the output should match "{regex}"') -@then('the output should match "{regex}" {num} times') -def matches_std_output(context, regex, num=1): - out = context.stdout_capture.getvalue() - matches = re.findall(regex, out) - assert ( - matches and len(matches) == num - ), f"\nRegex didn't match exactly {num} time(s):\n{regex}\n{str(out)}\n{str(matches)}" - - -@then('the error output should match "{regex}"') -@then('the error output should match "{regex}" {num} times') -def matches_err_ouput(context, regex, num=1): - out = context.stderr_capture.getvalue() - matches = re.findall(regex, out) - assert ( - matches and len(matches) == num - ), f"\nRegex didn't match exactly {num} time(s):\n{regex}\n{str(out)}\n{str(matches)}" - - -@then('the output should not contain "{text}"') -def check_output_not_inline(context, text): - out = context.stdout_capture.getvalue() - assert text not in out - - -@then('we should see the message "{text}"') -@then('the error output should be "{text}"') -def check_message(context, text): - out = context.stderr_capture.getvalue() - assert text in out, [text, out] - - -@then('we should not see the message "{text}"') -def check_not_message(context, text): - out = context.stderr_capture.getvalue() - assert text not in out, [text, out] - - -@then('the journal should contain "{text}"') -@then('journal "{journal_name}" should contain "{text}"') -def check_journal_content(context, text, journal_name="default"): - journal = read_journal(context, journal_name) - assert text in journal, journal - - -@then('the journal should not contain "{text}"') -@then('journal "{journal_name}" should not contain "{text}"') -def check_not_journal_content(context, text, journal_name="default"): - journal = read_journal(context, journal_name) - assert text not in journal, journal - - -@then("the journal should not exist") -@then('journal "{journal_name}" should not exist') -def journal_doesnt_exist(context, journal_name="default"): - configuration = load_config(context.config_path) - - journal_path = configuration["journals"][journal_name] - assert not os.path.exists(journal_path) - - -@then("the journal should exist") -@then('journal "{journal_name}" should exist') -def journal_exists(context, journal_name="default"): - configuration = load_config(context.config_path) - - journal_path = configuration["journals"][journal_name] - assert os.path.exists(journal_path) - - -@then('the config should have "{key}" set to') -@then('the config should have "{key}" set to "{value}"') -@then('the config for journal "{journal}" should have "{key}" set to "{value}"') -def config_var(context, key, value="", journal=None): - key_as_vec = key.split(".") - - if "args" in context: - parsed = parse_args(context.args) - overrides = parsed.config_override - value = read_value_from_string(value or context.text or "") - configuration = load_config(context.config_path) - - if journal: - configuration = configuration["journals"][journal] - - if overrides: - with patch.object( - jrnl.override, "_recursively_apply", wraps=_recursively_apply - ) as spy_recurse: - configuration = apply_overrides(overrides, configuration) - runtime_cfg = spy_recurse.call_args_list[0][0][0] - else: - runtime_cfg = configuration - # extract the value of the desired key from the configuration after overrides have been applied - for k in key_as_vec: - runtime_cfg = runtime_cfg["%s" % k] - assert runtime_cfg == value - - -@then('the config for journal "{journal}" should not have "{key}" set') -def config_no_var(context, key, value="", journal=None): - configuration = load_config(context.config_path) - - if journal: - configuration = configuration["journals"][journal] - - assert key not in configuration - - -@then("the journal should have {number:d} entries") -@then("the journal should have {number:d} entry") -@then('journal "{journal_name}" should have {number:d} entries') -@then('journal "{journal_name}" should have {number:d} entry') -def check_journal_entries(context, number, journal_name="default"): - journal = open_journal(context, journal_name) - assert len(journal.entries) == number - - -@when("the journal directory is listed") -def list_journal_directory(context, journal="default"): - with open(context.config_path) as config_file: - configuration = yaml.load(config_file, Loader=yaml.SafeLoader) - journal_path = configuration["journals"][journal] - for root, dirnames, f in os.walk(journal_path): - for file in f: - print(os.path.join(root, file)) - - -@then("fail") -def debug_fail(context): - assert False diff --git a/features/steps/export_steps.py b/features/steps/export_steps.py deleted file mode 100644 index 8141dc36..00000000 --- a/features/steps/export_steps.py +++ /dev/null @@ -1,200 +0,0 @@ -# Copyright (C) 2012-2021 jrnl contributors -# License: https://www.gnu.org/licenses/gpl-3.0.html - - -import json -import os -import shutil -import random -import string -from xml.etree import ElementTree -from behave import given -from behave import then - - -@then("the output should be {width:d} columns wide") -def check_output_width(context, width): - out = context.stdout_capture.getvalue() - out_lines = out.splitlines() - for line in out_lines: - assert len(line) <= width - - -@then("the output should be parsable as json") -def check_output_json(context): - out = context.stdout_capture.getvalue() - assert json.loads(out), out - - -@then('"{field}" in the json output should have {number:d} elements') -@then('"{field}" in the json output should have 1 element') -def check_output_field(context, field, number=1): - out = context.stdout_capture.getvalue() - out_json = json.loads(out) - assert field in out_json, [field, out_json] - assert len(out_json[field]) == number, len(out_json[field]) - - -@then('"{field}" in the json output should not contain "{key}"') -def check_output_field_not_key(context, field, key): - out = context.stdout_capture.getvalue() - out_json = json.loads(out) - assert field in out_json - assert key not in out_json[field] - - -@then('"{field}" in the json output should contain "{key}"') -def check_output_field_key(context, field, key): - out = context.stdout_capture.getvalue() - struct = json.loads(out) - - for node in field.split("."): - try: - struct = struct[int(node)] - except ValueError: - assert node in struct - struct = struct[node] - - assert key in struct - - -@then("the json output should contain {path}") -@then('the json output should contain {path} = "{value}"') -def check_json_output_path(context, path, value=None): - """E.g. - the json output should contain entries.0.title = "hello" - """ - out = context.stdout_capture.getvalue() - struct = json.loads(out) - - for node in path.split("."): - try: - struct = struct[int(node)] - except ValueError: - struct = struct[node] - - if value is not None: - assert struct == value, struct - else: - assert struct is not None - - -@then( - 'entry {entry_number:d} should have an array "{name}" with {items_number:d} elements' -) -def entry_array_count(context, entry_number, name, items_number): - # note that entry_number is 1-indexed. - out = context.stdout_capture.getvalue() - out_json = json.loads(out) - assert len(out_json["entries"][entry_number - 1][name]) == items_number - - -@then("the output should be a valid XML string") -def assert_valid_xml_string(context): - output = context.stdout_capture.getvalue() - xml_tree = ElementTree.fromstring(output) - assert xml_tree, output - - -@then('"{item}" node in the xml output should have {number:d} elements') -def assert_xml_output_entries_count(context, item, number): - output = context.stdout_capture.getvalue() - xml_tree = ElementTree.fromstring(output) - - xml_tags = (node.tag for node in xml_tree) - assert item in xml_tags, str(list(xml_tags)) - - actual_entry_count = len(xml_tree.find(item)) - assert actual_entry_count == number, actual_entry_count - - -@then('there should be {number:d} "{item}" elements') -def count_elements(context, number, item): - output = context.stdout_capture.getvalue() - xml_tree = ElementTree.fromstring(output) - assert len(xml_tree.findall(".//" + item)) == number - - -@then('"tags" in the xml output should contain {expected_tags_json_list}') -def assert_xml_output_tags(context, expected_tags_json_list): - output = context.stdout_capture.getvalue() - xml_tree = ElementTree.fromstring(output) - - xml_tags = (node.tag for node in xml_tree) - assert "tags" in xml_tags, str(list(xml_tags)) - - expected_tags = json.loads(expected_tags_json_list) - actual_tags = set(t.attrib["name"] for t in xml_tree.find("tags")) - assert actual_tags == set(expected_tags), [actual_tags, set(expected_tags)] - - -@given('we create cache directory "{dir_name}"') -@given("we create a cache directory") -def create_directory(context, dir_name=None): - if not dir_name: - dir_name = "cache_" + "".join( - random.choices(string.ascii_uppercase + string.digits, k=20) - ) - - working_dir = os.path.join("features", "cache", dir_name) - if os.path.exists(working_dir): - shutil.rmtree(working_dir) - os.makedirs(working_dir) - context.cache_dir = dir_name - - -@then('cache "{dir_name}" should contain the files') -@then('cache "{dir_name}" should contain the files {expected_files_json_list}') -@then("the cache should contain the files") -def assert_dir_contains_files(context, dir_name=None, expected_files_json_list=""): - if not dir_name: - dir_name = context.cache_dir - - working_dir = os.path.join("features", "cache", dir_name) - actual_files = os.listdir(working_dir) - - expected_files = context.text or expected_files_json_list - expected_files = expected_files.split("\n") - - # sort to deal with inconsistent default file ordering on different OS's - actual_files.sort() - expected_files.sort() - - assert actual_files == expected_files, [actual_files, expected_files] - - -@then('the content of file "{file_path}" in cache directory "{cache_dir}" should be') -@then('the content of file "{file_path}" in the cache should be') -def assert_exported_yaml_file_content(context, file_path, cache_dir=None): - if not cache_dir: - cache_dir = context.cache_dir - - expected_content = context.text.strip().splitlines() - full_file_path = os.path.join("features", "cache", cache_dir, file_path) - - with open(full_file_path, "r") as f: - actual_content = f.read().strip().splitlines() - - for actual_line, expected_line in zip(actual_content, expected_content): - if actual_line.startswith("tags: ") and expected_line.startswith("tags: "): - assert_equal_tags_ignoring_order( - actual_line, expected_line, actual_content, expected_content - ) - else: - assert actual_line.strip() == expected_line.strip(), [ - [actual_line.strip(), expected_line.strip()], - [actual_content, expected_content], - ] - - -def assert_equal_tags_ignoring_order( - actual_line, expected_line, actual_content, expected_content -): - actual_tags = set(tag.strip() for tag in actual_line[len("tags: ") :].split(",")) - expected_tags = set( - tag.strip() for tag in expected_line[len("tags: ") :].split(",") - ) - assert actual_tags == expected_tags, [ - [actual_tags, expected_tags], - [expected_content, actual_content], - ] diff --git a/features/steps/override.py b/features/steps/override.py deleted file mode 100644 index ff1760ed..00000000 --- a/features/steps/override.py +++ /dev/null @@ -1,77 +0,0 @@ -from jrnl.jrnl import run -from unittest import mock - -# from __future__ import with_statement -from jrnl.args import parse_args -from behave import then - -from features.steps.core import _mock_getpass, _mock_time_parse - - -@then("the editor {editor} should have been called") -@then("No editor should have been called") -def editor_override(context, editor=None): - def _mock_write_in_editor(config): - editor = config["editor"] - journal = "features/journals/journal.jrnl" - context.tmpfile = journal - print("%s has been launched" % editor) - return journal - - if "password" in context: - password = context.password - else: - password = "" - # fmt: off - # see: https://github.com/psf/black/issues/664 - with \ - mock.patch("jrnl.jrnl._write_in_editor", side_effect=_mock_write_in_editor(context.jrnl_config)) as mock_write_in_editor, \ - mock.patch("sys.stdin.isatty", return_value=True), \ - mock.patch('getpass.getpass',side_effect=_mock_getpass(password)), \ - mock.patch("jrnl.time.parse", side_effect = _mock_time_parse(context)), \ - mock.patch("jrnl.config.get_config_path", side_effect=lambda: context.config_path), \ - mock.patch("jrnl.install.get_config_path", side_effect=lambda: context.config_path) \ - : - try : - parsed_args = parse_args(context.args) - run(parsed_args) - context.exit_status = 0 - context.editor = mock_write_in_editor - expected_config = context.jrnl_config - expected_config['editor'] = '%s'%editor - expected_config['journal'] ='features/journals/journal.jrnl' - - if editor is not None: - assert mock_write_in_editor.call_count == 1 - assert mock_write_in_editor.call_args[0][0]['editor']==editor - else: - # Expect that editor is *never* called - mock_write_in_editor.assert_not_called() - except SystemExit as e: - context.exit_status = e.code - # fmt: on - - -@then("the stdin prompt should have been called") -def override_editor_to_use_stdin(context): - - try: - with mock.patch( - "sys.stdin.read", - return_value="Zwei peanuts walk into a bar und one of zem was a-salted", - ) as mock_stdin_read, mock.patch( - "jrnl.install.load_or_install_jrnl", return_value=context.jrnl_config - ), mock.patch( - "jrnl.Journal.open_journal", - spec=False, - return_value="features/journals/journal.jrnl", - ), mock.patch( - "getpass.getpass", side_effect=_mock_getpass("test") - ): - parsed_args = parse_args(context.args) - run(parsed_args) - context.exit_status = 0 - mock_stdin_read.assert_called_once() - - except SystemExit as e: - context.exit_status = e.code diff --git a/features/tag.feature b/features/tag.feature deleted file mode 100644 index b7b687b5..00000000 --- a/features/tag.feature +++ /dev/null @@ -1,53 +0,0 @@ -Feature: Tagging -# See search.feature for tag-related searches -# And format.feature for tag-related output - - Scenario Outline: Tags should allow certain special characters such as /, +, # - Given we use the config ".yaml" - When we run "jrnl 2020-09-26: This is an entry about @os/2 and @c++ and @c#" - When we run "jrnl --tags -on 2020-09-26" - Then we should get no error - And the output should be - """ - @os/2 : 1 - @c++ : 1 - @c# : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Emails addresses should not be parsed as tags - Given we use the config ".yaml" - When we run "jrnl 2020-09-26: The email address test@example.com does not seem to work for me" - When we run "jrnl 2020-09-26: The email address test@example.org also does not work for me" - When we run "jrnl 2020-09-26: I tried test@example.org and test@example.edu too" - Then we flush the output - When we run "jrnl --tags -on 2020-09-26" - Then we should get no error - And the output should be "[No tags found in journal.]" - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | - - Scenario Outline: Entry can start and end with tags - Given we use the config ".yaml" - When we run "jrnl 2020-09-26: @foo came over, we went to a @bar" - When we run "jrnl --tags -on 2020-09-26" - Then the output should be - """ - @foo : 1 - @bar : 1 - """ - - Examples: configs - | config | - | basic_onefile | - | basic_folder | - | basic_dayone | diff --git a/features/upgrade.feature b/features/upgrade.feature deleted file mode 100644 index fda47363..00000000 --- a/features/upgrade.feature +++ /dev/null @@ -1,71 +0,0 @@ -Feature: Upgrading Journals from 1.x.x to 2.x.x - - Scenario: Upgrade and parse journals with square brackets - Given we use the config "upgrade_from_195.json" - When we run "jrnl -9" and enter "Y" - Then the journal should have 2 entries - And the output should contain - """ - 2010-06-10 15:00 A life without chocolate is like a bad analogy. - """ - And the output should contain - """ - 2013-06-10 15:40 He said "[this] is the best time to be alive". - """ - - Scenario: Upgrading a journal encrypted with jrnl 1.x - Given we use the config "encrypted_old.json" - When we run "jrnl -n 1" and enter - """ - Y - bad doggie no biscuit - bad doggie no biscuit - """ - Then we should be prompted for a password - And the output should contain "2013-06-10 15:40 Life is good" - - Scenario: Upgrading a config without colors to colors - Given we use the config "no_colors.yaml" - When we run "jrnl -n 1" - Then the config should have "colors" set to - """ - { - 'date':'none', - 'title':'none', - 'body':'none', - 'tags':'none' - } - """ - - Scenario: Upgrade and parse journals with little endian date format - Given we use the config "upgrade_from_195_little_endian_dates.json" - When we run "jrnl -9" and enter "Y" - Then the journal should have 2 entries - And the output should contain - """ - 10.06.2010 15:00 A life without chocolate is like a bad analogy. - """ - And the output should contain - """ - 10.06.2013 15:40 He said "[this] is the best time to be alive". - """ - - Scenario: Upgrade with missing journal - Given we use the config "upgrade_from_195_with_missing_journal.json" - When we run "jrnl -ls" and enter - """" - Y - """ - Then the output should contain "Error: features/journals/missing.journal does not exist." - And we should get no error - - Scenario: Upgrade with missing encrypted journal - Given we use the config "upgrade_from_195_with_missing_encrypted_journal.json" - When we run "jrnl -ls" and enter - """ - Y - bad doggie no biscuit - """ - Then the output should contain "Error: features/journals/missing.journal does not exist." - And the error output should contain "We're all done" - And we should get no error diff --git a/features/write.feature b/features/write.feature deleted file mode 100644 index eb22e480..00000000 --- a/features/write.feature +++ /dev/null @@ -1,216 +0,0 @@ -Feature: Writing new entries. - - Scenario Outline: Multiline entry with punctuation should keep title punctuation - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl This is. the title\\n This is the second line" - And we run "jrnl -n 1" - Then the output should contain "This is. the title" - - Examples: configs - | config_file | - | simple | - | empty_folder | - | dayone | - | encrypted | - - Scenario Outline: Single line entry with period should be split at period - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl This is. the title" - And we run "jrnl -1" - Then the output should contain "| the title" - - Examples: configs - | config_file | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: CJK entry should be split at fullwidth period without following space. - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl 七転び。八起き" - And we run "jrnl -1" - Then the output should contain "| 八起き" - - Examples: configs - | config_file | - | basic_onefile | - | basic_encrypted | - | basic_folder | - | basic_dayone | - - Scenario Outline: Writing an entry from command line should store the entry - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl 23 july 2013: A cold and stormy day. I ate crisps on the sofa." - Then we should see the message "Entry added" - When we run "jrnl -n 1" - Then the output should contain "2013-07-23 09:00 A cold and stormy day." - - Examples: configs - | config_file | - | simple | - | empty_folder | - | dayone | - | encrypted | - - Scenario Outline: Writing a partial entry from command line with edit flag should go to the editor - Given we use the config ".yaml" - And we use the password "test" if prompted - When we run "jrnl this is a partial --edit" - Then we should see the message "Entry added" - Then the editor should have been called - And the editor file content should be - """ - this is a partial - """ - When we run "jrnl -n 1" - Then the output should contain "this is a partial" - - Examples: configs - | config_file | - | basic_onefile | - | basic_encrypted | - | basic_dayone | - | basic_folder | - - Scenario Outline: Writing an empty entry from the editor should yield "Nothing saved to file" message - Given we use the config ".yaml" - And we use the password "test" if prompted - When we open the editor and enter nothing - Then the error output should contain "[Nothing saved to file]" - - Examples: configs - | config_file | - | editor | - | editor_empty_folder | - | dayone | - | basic_encrypted | - | basic_onefile | - - @skip - Scenario Outline: Writing an empty entry from the command line with no editor should yield nothing - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl" and enter nothing - Then the output should be empty - And the error output should contain "Writing Entry; on a blank line" - And the editor should not have been called - - Examples: configs - | config_file | - | simple | - | empty_folder | - | encrypted | - # | dayone | @todo - - Scenario Outline: Writing an entry does not print the entire journal - # https://github.com/jrnl-org/jrnl/issues/87 - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl 23 july 2013: A cold and stormy day. I ate crisps on the sofa." - Then we should see the message "Entry added" - When we run "jrnl -n 1" - Then the output should not contain "Life is good" - - Examples: configs - | config_file | - | editor | - | editor_empty_folder | - | dayone | - | encrypted | - - Scenario Outline: Embedded period stays in title - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl 04-24-2014: Created a new website - empty.com. Hope to get a lot of traffic." - Then we should see the message "Entry added" - When we run "jrnl -1" - Then the output should be - """ - 2014-04-24 09:00 Created a new website - empty.com. - | Hope to get a lot of traffic. - """ - - Examples: configs - | config_file | - | simple | - | empty_folder | - | dayone | - | encrypted | - - Scenario Outline: Write and read emoji support - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl 23 july 2013: 🌞 sunny day. Saw an 🐘" - Then we should see the message "Entry added" - When we run "jrnl -n 1" - Then the output should contain "🌞" - And the output should contain "🐘" - - Examples: configs - | config_file | - | simple | - | empty_folder | - | dayone | - | encrypted | - - Scenario Outline: Writing an entry at the prompt (no editor) should store the entry - Given we use the config ".yaml" - And we use the password "bad doggie no biscuit" if prompted - When we run "jrnl" and enter "25 jul 2013: I saw Elvis. He's alive." - Then we should get no error - When we run "jrnl -on '2013-07-25'" - Then the output should contain "2013-07-25 09:00 I saw Elvis." - And the output should contain "| He's alive." - - Examples: configs - | config_file | - | simple | - | empty_folder | - | encrypted | - - @todo - Scenario: Writing an entry at the prompt (no editor) in DayOne journal - # Need to test DayOne w/out an editor - - Scenario: Writing into Dayone - Given we use the config "dayone.yaml" - When we run "jrnl 01 may 1979: Being born hurts." - And we run "jrnl -until 1980" - Then the output should be "1979-05-01 09:00 Being born hurts." - - Scenario: Writing into Dayone adds extended metadata - Given we use the config "dayone.yaml" - When we run "jrnl 01 may 1979: Being born hurts." - And we run "jrnl --export json" - Then "entries" in the json output should have 5 elements - And the json output should contain entries.0.creator.software_agent - And the json output should contain entries.0.creator.os_agent - And the json output should contain entries.0.creator.host_name - And the json output should contain entries.0.creator.generation_date - And the json output should contain entries.0.creator.device_agent - And "entries.0.creator.software_agent" in the json output should contain "jrnl" - - # fails when system time is UTC (as on Travis-CI) - @skip - Scenario: Title with an embedded period on DayOne journal - Given we use the config "dayone.yaml" - When we run "jrnl 04-24-2014: "Ran 6.2 miles today in 1:02:03. I'm feeling sore because I forgot to stretch."" - Then we should see the message "Entry added" - When we run "jrnl -1" - Then the output should be - """ - 2014-04-24 09:00 Ran 6.2 miles today in 1:02:03. - | I'm feeling sore because I forgot to stretch. - """ - - Scenario: Opening an folder that's not a DayOne folder should treat as folder journal - Given we use the config "empty_folder.yaml" - When we run "jrnl 23 july 2013: Testing folder journal." - Then we should see the message "Entry added" - When we run "jrnl -1" - Then the output should be "2013-07-23 09:00 Testing folder journal." diff --git a/jrnl/jrnl.py b/jrnl/jrnl.py index 2d06115d..bc7e0b88 100644 --- a/jrnl/jrnl.py +++ b/jrnl/jrnl.py @@ -40,9 +40,7 @@ def run(args): original_config = config.copy() # Apply config overrides - overrides = args.config_override - if overrides: - config = apply_overrides(overrides, config) + config = apply_overrides(args, config) args = get_journal_name(args, config) config = scope_config(config, args.journal_name) diff --git a/jrnl/override.py b/jrnl/override.py index 7fd718f0..760b003e 100644 --- a/jrnl/override.py +++ b/jrnl/override.py @@ -1,7 +1,8 @@ from .config import update_config, make_yaml_valid_dict +from argparse import Namespace # import logging -def apply_overrides(overrides: list, base_config: dict) -> dict: +def apply_overrides(args: Namespace, base_config: dict) -> dict: """Unpack CLI provided overrides into the configuration tree. :param overrides: List of configuration key-value pairs collected from the CLI @@ -11,6 +12,10 @@ def apply_overrides(overrides: list, base_config: dict) -> dict: :return: Configuration to be used during runtime with the overrides applied :rtype: dict """ + overrides = vars(args).get("config_override", None) + if not overrides: + return base_config + cfg_with_overrides = base_config.copy() for pairs in overrides: diff --git a/poetry.lock b/poetry.lock index e718ea5a..8c86d892 100644 --- a/poetry.lock +++ b/poetry.lock @@ -69,23 +69,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "behave" -version = "1.2.6" -description = "behave is behaviour-driven development, Python style" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[package.dependencies] -parse = ">=1.8.2" -parse-type = ">=0.4.2" -six = ">=1.11" - -[package.extras] -develop = ["coverage", "pytest (>=3.0)", "pytest-cov", "tox", "invoke (>=0.21.0)", "path.py (>=8.1.2)", "pycmd", "pathlib", "modernize (>=0.5)", "pylint"] -docs = ["sphinx (>=1.6)", "sphinx-bootstrap-theme (>=0.6)"] - [[package]] name = "black" version = "21.9b0" @@ -177,7 +160,7 @@ test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pr [[package]] name = "decorator" -version = "5.0.9" +version = "5.1.0" description = "Decorators for Humans" category = "dev" optional = false @@ -199,7 +182,7 @@ pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "ghp-import" -version = "2.0.1" +version = "2.0.2" description = "Copy your docs directly to the gh-pages branch." category = "dev" optional = false @@ -221,7 +204,7 @@ python-versions = "*" [[package]] name = "importlib-metadata" -version = "4.6.1" +version = "4.8.1" description = "Read metadata from Python packages" category = "main" optional = false @@ -259,7 +242,7 @@ toml = {version = ">=0.10.2", markers = "python_version > \"3.6\""} [[package]] name = "ipython" -version = "7.25.0" +version = "7.28.0" description = "IPython: Productive Interactive Computing" category = "dev" optional = false @@ -289,14 +272,6 @@ parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "jedi" version = "0.18.0" @@ -314,14 +289,14 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] [[package]] name = "jeepney" -version = "0.7.0" +version = "0.7.1" description = "Low-level, pure Python DBus protocol wrapper." category = "main" optional = false python-versions = ">=3.6" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] trio = ["trio", "async-generator"] [[package]] @@ -358,7 +333,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "mako" -version = "1.1.4" +version = "1.1.5" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." category = "main" optional = false @@ -395,7 +370,7 @@ python-versions = ">=3.6" [[package]] name = "matplotlib-inline" -version = "0.1.2" +version = "0.1.3" description = "Inline Matplotlib backend for Jupyter" category = "dev" optional = false @@ -535,7 +510,7 @@ python-versions = "*" [[package]] name = "platformdirs" -version = "2.2.0" +version = "2.4.0" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false @@ -547,17 +522,18 @@ test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "pprintpp" @@ -569,11 +545,11 @@ python-versions = "*" [[package]] name = "prompt-toolkit" -version = "3.0.19" +version = "3.0.20" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.6.2" [package.dependencies] wcwidth = "*" @@ -620,7 +596,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.9.0" +version = "2.10.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -753,7 +729,7 @@ pyyaml = "*" [[package]] name = "regex" -version = "2021.7.6" +version = "2021.9.30" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -761,7 +737,7 @@ python-versions = "*" [[package]] name = "rich" -version = "10.6.0" +version = "10.11.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "dev" optional = false @@ -814,7 +790,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.0.4" +version = "1.2.1" description = "A lil' TOML parser" category = "dev" optional = false @@ -822,15 +798,12 @@ python-versions = ">=3.6" [[package]] name = "traitlets" -version = "5.0.5" +version = "5.1.0" description = "Traitlets Python configuration system" category = "dev" optional = false python-versions = ">=3.7" -[package.dependencies] -ipython-genutils = "*" - [package.extras] test = ["pytest"] @@ -863,14 +836,14 @@ pytz = "*" [[package]] name = "watchdog" -version = "2.1.3" +version = "2.1.6" description = "Filesystem events monitoring" category = "dev" optional = false python-versions = ">=3.6" [package.extras] -watchmedo = ["PyYAML (>=3.10)", "argh (>=0.24.1)"] +watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" @@ -907,7 +880,7 @@ test = ["coverage", "flake8", "wheel"] [[package]] name = "zipp" -version = "3.5.0" +version = "3.6.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false @@ -918,12 +891,12 @@ docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] -testing = ["behave", "pytest", "pytest-bdd", "toml"] +testing = ["pytest", "pytest-bdd", "toml"] [metadata] lock-version = "1.1" python-versions = ">=3.7.0, <3.11" -content-hash = "c4f943f3dbd96f5aab8ad0ef2f3d3f6a7096dc75ea7d3e449949695d340208fb" +content-hash = "fc24941ef7a065e56487518ccab053638f053e49f4e47f1746cd9fbfcef40546" [metadata.files] ansiwrap = [ @@ -953,10 +926,6 @@ backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] -behave = [ - {file = "behave-1.2.6-py2.py3-none-any.whl", hash = "sha256:ebda1a6c9e5bfe95c5f9f0a2794e01c7098b3dde86c10a95d8621c5907ff6f1c"}, - {file = "behave-1.2.6.tar.gz", hash = "sha256:b9662327aa53294c1351b0a9c369093ccec1d21026f050c3bd9b3e5cccf81a86"}, -] black = [ {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, @@ -969,11 +938,6 @@ cffi = [ {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, - {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, - {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, @@ -1043,23 +1007,23 @@ cryptography = [ {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, ] decorator = [ - {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, - {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, + {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, + {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, ] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] ghp-import = [ - {file = "ghp-import-2.0.1.tar.gz", hash = "sha256:753de2eace6e0f7d4edfb3cce5e3c3b98cd52aadb80163303d1d036bda7b4483"}, - {file = "ghp_import-2.0.1-py3-none-any.whl", hash = "sha256:8241a8e9f8dd3c1fafe9696e6e081b57a208ef907e9939c44e7415e407ab40ea"}, + {file = "ghp-import-2.0.2.tar.gz", hash = "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071"}, + {file = "ghp_import-2.0.2-py3-none-any.whl", hash = "sha256:5f8962b30b20652cdffa9c5a9812f7de6bcb56ec475acac579807719bf242c46"}, ] glob2 = [ {file = "glob2-0.7.tar.gz", hash = "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1069,20 +1033,16 @@ ipdb = [ {file = "ipdb-0.13.9.tar.gz", hash = "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"}, ] ipython = [ - {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"}, - {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, + {file = "ipython-7.28.0-py3-none-any.whl", hash = "sha256:f16148f9163e1e526f1008d7c8d966d9c15600ca20d1a754287cf96d00ba6f1d"}, + {file = "ipython-7.28.0.tar.gz", hash = "sha256:2097be5c814d1b974aea57673176a924c4c8c9583890e7a5f082f547b9975b11"}, ] jedi = [ {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, ] jeepney = [ - {file = "jeepney-0.7.0-py3-none-any.whl", hash = "sha256:71335e7a4e93817982f473f3507bffc2eff7a544119ab9b73e089c8ba1409ba3"}, - {file = "jeepney-0.7.0.tar.gz", hash = "sha256:1237cd64c8f7ac3aa4b3f332c4d0fb4a8216f39eaa662ec904302d4d77de5a54"}, + {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, + {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, @@ -1093,30 +1053,20 @@ keyring = [ {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, ] mako = [ - {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"}, - {file = "Mako-1.1.4.tar.gz", hash = "sha256:17831f0b7087c313c0ffae2bcbbd3c1d5ba9eeac9c38f2eb7b50e8c99fe9d5ab"}, + {file = "Mako-1.1.5-py2.py3-none-any.whl", hash = "sha256:6804ee66a7f6a6416910463b00d76a7b25194cd27f1918500c5bd7be2a088a23"}, + {file = "Mako-1.1.5.tar.gz", hash = "sha256:169fa52af22a91900d852e937400e79f535496191c63712e3b9fda5a9bed6fc3"}, ] markdown = [ {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1125,21 +1075,14 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1149,16 +1092,13 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] matplotlib-inline = [ - {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"}, - {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"}, + {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, + {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, @@ -1208,20 +1148,20 @@ pickleshare = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] platformdirs = [ - {file = "platformdirs-2.2.0-py3-none-any.whl", hash = "sha256:4666d822218db6a262bdfdc9c39d21f23b4cfdb08af331a81e92751daf6c866c"}, - {file = "platformdirs-2.2.0.tar.gz", hash = "sha256:632daad3ab546bd8e6af0537d09805cec458dce201bccfe23012df73332e181e"}, + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, ] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] pprintpp = [ {file = "pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d"}, {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"}, - {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"}, + {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, + {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -1244,8 +1184,8 @@ pyflakes = [ {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1289,26 +1229,18 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, @@ -1318,67 +1250,51 @@ pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] regex = [ - {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf1d2d183abc7faa101ebe0b8d04fd19cb9138820abc8589083035c9440b8ca6"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1947e7de155063e1c495c50590229fb98720d4c383af5031bbcb413db33fa1be"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17d8a3f99b18d87ac54a449b836d485cc8c195bb6f5e4379c84c8519045facc9"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d30895ec80cc80358392841add9dde81ea1d54a4949049269115e6b0555d0498"}, - {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, - {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, - {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8244c681018423a0d1784bc6b9af33bdf55f2ab8acb1f3cd9dd83d90e0813253"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a4c742089faf0e51469c6a1ad7e3d3d21afae54a16a6cead85209dfe0a1ce65"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914e626dc8e75fe4fc9b7214763f141d9f40165d00dfe680b104fa1b24063bbf"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fabb19c82ecf39832a3f5060dfea9a7ab270ef156039a1143a29a83a09a62de"}, - {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, - {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, - {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfc0957c4a4b91eff5ad036088769e600a25774256cd0e1154378591ce573f08"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efb4af05fa4d2fc29766bf516f1f5098d6b5c3ed846fde980c18bf8646ad3979"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7423aca7cc30a6228ccdcf2ea76f12923d652c5c7c6dc1959a0b004e308f39fb"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb9834c1e77493efd7343b8e38950dee9797d2d6f2d5fd91c008dfaef64684b9"}, - {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, - {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, - {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598ee917dbe961dcf827217bf2466bb86e4ee5a8559705af57cbabb3489dd37e"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:56fc7045a1999a8d9dd1896715bc5c802dfec5b9b60e883d2cbdecb42adedea4"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8363ac90ea63c3dd0872dfdb695f38aff3334bfa5712cffb238bd3ffef300e3"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:716a6db91b3641f566531ffcc03ceec00b2447f0db9942b3c6ea5d2827ad6be3"}, - {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, - {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, - {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, + {file = "regex-2021.9.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66696c8336a1b5d1182464f3af3427cc760118f26d0b09a2ddc16a976a4d2637"}, + {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d87459ad3ab40cd8493774f8a454b2e490d8e729e7e402a0625867a983e4e02"}, + {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf6a1e023caf5e9a982f5377414e1aeac55198831b852835732cfd0a0ca5ff"}, + {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:255791523f80ea8e48e79af7120b4697ef3b74f6886995dcdb08c41f8e516be0"}, + {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e502f8d4e5ef714bcc2c94d499684890c94239526d61fdf1096547db91ca6aa6"}, + {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4907fb0f9b9309a5bded72343e675a252c2589a41871874feace9a05a540241e"}, + {file = "regex-2021.9.30-cp310-cp310-win32.whl", hash = "sha256:3be40f720af170a6b20ddd2ad7904c58b13d2b56f6734ee5d09bbdeed2fa4816"}, + {file = "regex-2021.9.30-cp310-cp310-win_amd64.whl", hash = "sha256:c2b180ed30856dfa70cfe927b0fd38e6b68198a03039abdbeb1f2029758d87e7"}, + {file = "regex-2021.9.30-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6f2d2f93001801296fe3ca86515eb04915472b5380d4d8752f09f25f0b9b0ed"}, + {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa7ba9ab2eba7284e0d7d94f61df7af86015b0398e123331362270d71fab0b9"}, + {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28040e89a04b60d579c69095c509a4f6a1a5379cd865258e3a186b7105de72c6"}, + {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f588209d3e4797882cd238195c175290dbc501973b10a581086b5c6bcd095ffb"}, + {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42952d325439ef223e4e9db7ee6d9087b5c68c5c15b1f9de68e990837682fc7b"}, + {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cae4099031d80703954c39680323dabd87a69b21262303160776aa0e55970ca0"}, + {file = "regex-2021.9.30-cp36-cp36m-win32.whl", hash = "sha256:0de8ad66b08c3e673b61981b9e3626f8784d5564f8c3928e2ad408c0eb5ac38c"}, + {file = "regex-2021.9.30-cp36-cp36m-win_amd64.whl", hash = "sha256:b345ecde37c86dd7084c62954468a4a655fd2d24fd9b237949dd07a4d0dd6f4c"}, + {file = "regex-2021.9.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6f08187136f11e430638c2c66e1db091105d7c2e9902489f0dbc69b44c222b4"}, + {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55442650f541d195a535ccec33078c78a9521973fb960923da7515e9ed78fa6"}, + {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e9c489aa98f50f367fb26cc9c8908d668e9228d327644d7aa568d47e456f47"}, + {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2cb7d4909ed16ed35729d38af585673f1f0833e73dfdf0c18e5be0061107b99"}, + {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0861e7f6325e821d5c40514c551fd538b292f8cc3960086e73491b9c5d8291d"}, + {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:81fdc90f999b2147fc62e303440c424c47e5573a9b615ed5d43a5b832efcca9e"}, + {file = "regex-2021.9.30-cp37-cp37m-win32.whl", hash = "sha256:8c1ad61fa024195136a6b7b89538030bd00df15f90ac177ca278df9b2386c96f"}, + {file = "regex-2021.9.30-cp37-cp37m-win_amd64.whl", hash = "sha256:e3770781353a4886b68ef10cec31c1f61e8e3a0be5f213c2bb15a86efd999bc4"}, + {file = "regex-2021.9.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c065d95a514a06b92a5026766d72ac91bfabf581adb5b29bc5c91d4b3ee9b83"}, + {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9925985be05d54b3d25fd6c1ea8e50ff1f7c2744c75bdc4d3b45c790afa2bcb3"}, + {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470f2c882f2672d8eeda8ab27992aec277c067d280b52541357e1acd7e606dae"}, + {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad0517df22a97f1da20d8f1c8cb71a5d1997fa383326b81f9cf22c9dadfbdf34"}, + {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e30838df7bfd20db6466fd309d9b580d32855f8e2c2e6d74cf9da27dcd9b63"}, + {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b34d2335d6aedec7dcadd3f8283b9682fadad8b9b008da8788d2fce76125ebe"}, + {file = "regex-2021.9.30-cp38-cp38-win32.whl", hash = "sha256:e07049cece3462c626d650e8bf42ddbca3abf4aa08155002c28cb6d9a5a281e2"}, + {file = "regex-2021.9.30-cp38-cp38-win_amd64.whl", hash = "sha256:37868075eda024470bd0feab872c692ac4ee29db1e14baec103257bf6cc64346"}, + {file = "regex-2021.9.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d331f238a7accfbbe1c4cd1ba610d4c087b206353539331e32a8f05345c74aec"}, + {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6348a7ab2a502cbdd0b7fd0496d614007489adb7361956b38044d1d588e66e04"}, + {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b1cca6c23f19bee8dc40228d9c314d86d1e51996b86f924aca302fc8f8bf9"}, + {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f1125bc5172ab3a049bc6f4b9c0aae95a2a2001a77e6d6e4239fa3653e202b5"}, + {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:638e98d069b14113e8afba6a54d1ca123f712c0d105e67c1f9211b2a825ef926"}, + {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a0b0db6b49da7fa37ca8eddf9f40a8dbc599bad43e64f452284f37b6c34d91c"}, + {file = "regex-2021.9.30-cp39-cp39-win32.whl", hash = "sha256:9910869c472e5a6728680ca357b5846546cbbd2ab3ad5bef986ef0bc438d0aa6"}, + {file = "regex-2021.9.30-cp39-cp39-win_amd64.whl", hash = "sha256:3b71213ec3bad9a5a02e049f2ec86b3d7c3e350129ae0f4e2f99c12b5da919ed"}, + {file = "regex-2021.9.30.tar.gz", hash = "sha256:81e125d9ba54c34579e4539a967e976a3c56150796674aec318b1b2f49251be7"}, ] rich = [ - {file = "rich-10.6.0-py3-none-any.whl", hash = "sha256:d3f72827cd5df13b2ef7f1a97f81ec65548d4fdeb92cef653234f227580bbb2a"}, - {file = "rich-10.6.0.tar.gz", hash = "sha256:128261b3e2419a4ef9c97066ccc2abbfb49fa7c5e89c3fe4056d00aa5e9c1e65"}, + {file = "rich-10.11.0-py3-none-any.whl", hash = "sha256:44bb3f9553d00b3c8938abf89828df870322b9ba43caf3b12bb7758debdc6dec"}, + {file = "rich-10.11.0.tar.gz", hash = "sha256:016fa105f34b69c434e7f908bb5bd7fefa9616efdb218a2917117683a6394ce5"}, ] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, @@ -1397,12 +1313,12 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.0.4-py3-none-any.whl", hash = "sha256:0713b16ff91df8638a6a694e295c8159ab35ba93e3424a626dd5226d386057be"}, - {file = "tomli-1.0.4.tar.gz", hash = "sha256:be670d0d8d7570fd0ea0113bd7bb1ba3ac6706b4de062cc4c952769355c9c268"}, + {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, + {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, ] traitlets = [ - {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, - {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, + {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, + {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, ] typed-ast = [ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, @@ -1446,27 +1362,29 @@ tzlocal = [ {file = "tzlocal-2.1.tar.gz", hash = "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44"}, ] watchdog = [ - {file = "watchdog-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9628f3f85375a17614a2ab5eac7665f7f7be8b6b0a2a228e6f6a2e91dd4bfe26"}, - {file = "watchdog-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:acc4e2d5be6f140f02ee8590e51c002829e2c33ee199036fcd61311d558d89f4"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85b851237cf3533fabbc034ffcd84d0fa52014b3121454e5f8b86974b531560c"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a12539ecf2478a94e4ba4d13476bb2c7a2e0a2080af2bb37df84d88b1b01358a"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6fe9c8533e955c6589cfea6f3f0a1a95fb16867a211125236c82e1815932b5d7"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d9456f0433845e7153b102fffeb767bde2406b76042f2216838af3b21707894e"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd8c595d5a93abd441ee7c5bb3ff0d7170e79031520d113d6f401d0cf49d7c8f"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0bcfe904c7d404eb6905f7106c54873503b442e8e918cc226e1828f498bdc0ca"}, - {file = "watchdog-2.1.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf84bd94cbaad8f6b9cbaeef43080920f4cb0e61ad90af7106b3de402f5fe127"}, - {file = "watchdog-2.1.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b8ddb2c9f92e0c686ea77341dcb58216fa5ff7d5f992c7278ee8a392a06e86bb"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8805a5f468862daf1e4f4447b0ccf3acaff626eaa57fbb46d7960d1cf09f2e6d"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:3e305ea2757f81d8ebd8559d1a944ed83e3ab1bdf68bcf16ec851b97c08dc035"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_i686.whl", hash = "sha256:431a3ea70b20962e6dee65f0eeecd768cd3085ea613ccb9b53c8969de9f6ebd2"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:e4929ac2aaa2e4f1a30a36751160be391911da463a8799460340901517298b13"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:201cadf0b8c11922f54ec97482f95b2aafca429c4c3a4bb869a14f3c20c32686"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:3a7d242a7963174684206093846537220ee37ba9986b824a326a8bb4ef329a33"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:54e057727dd18bd01a3060dbf5104eb5a495ca26316487e0f32a394fd5fe725a"}, - {file = "watchdog-2.1.3-py3-none-win32.whl", hash = "sha256:b5fc5c127bad6983eecf1ad117ab3418949f18af9c8758bd10158be3647298a9"}, - {file = "watchdog-2.1.3-py3-none-win_amd64.whl", hash = "sha256:44acad6f642996a2b50bb9ce4fb3730dde08f23e79e20cd3d8e2a2076b730381"}, - {file = "watchdog-2.1.3-py3-none-win_ia64.whl", hash = "sha256:0bcdf7b99b56a3ae069866c33d247c9994ffde91b620eaf0306b27e099bd1ae0"}, - {file = "watchdog-2.1.3.tar.gz", hash = "sha256:e5236a8e8602ab6db4b873664c2d356c365ab3cac96fbdec4970ad616415dd45"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, + {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, + {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, + {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, + {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, + {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, + {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, + {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -1481,6 +1399,6 @@ yq = [ {file = "yq-2.12.2.tar.gz", hash = "sha256:2f156d0724b61487ac8752ed4eaa702a5737b804d5afa46fa55866951cd106d2"}, ] zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, ] diff --git a/pyproject.toml b/pyproject.toml index b81e051b..098211e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,13 +47,11 @@ tzlocal = ">2.0, <3.0" # https://github.com/regebro/tzlocal/blob/master/CHANGE # I don't like repeating deps here, but # there's no other way to do this yet until poetry v1.2 releases # see: https://github.com/python-poetry/poetry/issues/1644 -behave = { version = "^1.2", optional = true } pytest = { version = ">=6.2", optional = true } pytest-bdd = { version = ">=4.0.1", optional = true } toml = { version = ">=0.10", optional = true } [tool.poetry.dev-dependencies] -behave = "^1.2" mkdocs = ">=1.0" black = { version = ">=21.5b2", allow-prereleases = true } toml = ">=0.10" @@ -65,7 +63,7 @@ pyproject-flake8 = "*" yq = "*" [tool.poetry.extras] -testing = [ "behave", "pytest", "pytest-bdd", "toml" ] +testing = [ "pytest", "pytest-bdd", "toml" ] [tool.poetry.scripts] jrnl = 'jrnl.cli:cli' diff --git a/tests/bdd/features/override.feature b/tests/bdd/features/override.feature index 3d9fb27f..b29b11f0 100644 --- a/tests/bdd/features/override.feature +++ b/tests/bdd/features/override.feature @@ -8,13 +8,11 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys And the editor should not have been called - # @todo implement this step in pytest (doesn't currently support overrides) - @skip Scenario: Postconfig commands with overrides Given we use the config "basic_encrypted.yaml" And we use the password "test" if prompted When we run "jrnl --decrypt --config-override highlight false --config-override editor nano" - Then the config should contain "highlight: false" + Then the config in memory should contain "highlight: false" Then the editor should not have been called @@ -38,23 +36,24 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys ┖─────────────────────┘ - # @todo implement this step in pytest (doesn't currently support overrides) - @skip Scenario: Override color selections with runtime overrides Given we use the config "basic_encrypted.yaml" And we use the password "test" if prompted When we run "jrnl -1 --config-override colors.body blue" - Then the config should have "colors.body" set to "blue" + Then the config in memory should contain "colors.body: blue" - # @todo implement this step in pytest (doesn't currently support overrides) - @skip Scenario: Apply multiple config overrides Given we use the config "basic_encrypted.yaml" And we use the password "test" if prompted When we run "jrnl -1 --config-override colors.body green --config-override editor 'nano'" - Then the config should have "colors.body" set to "green" - And the config should have "editor" set to "nano" + Then the config in memory should contain + editor: nano + colors: + title: none + body: green + tags: none + date: none Scenario: Override default journal diff --git a/tests/lib/fixtures.py b/tests/lib/fixtures.py index a93a7e43..1b4c74dc 100644 --- a/tests/lib/fixtures.py +++ b/tests/lib/fixtures.py @@ -143,10 +143,15 @@ def user_input(): @fixture -def config_data(config_path): +def config_on_disk(config_path): return load_config(config_path) +@fixture +def config_in_memory(): + return dict() + + @fixture def journal_name(): return None diff --git a/tests/lib/helpers.py b/tests/lib/helpers.py index 7d089597..2e1f454a 100644 --- a/tests/lib/helpers.py +++ b/tests/lib/helpers.py @@ -1,6 +1,7 @@ # Copyright (C) 2012-2021 jrnl contributors # License: https://www.gnu.org/licenses/gpl-3.0.html +import functools import os @@ -38,3 +39,13 @@ def assert_equal_tags_ignoring_order( [actual_tags, expected_tags], [expected_content, actual_content], ] + + +# @see: https://stackoverflow.com/a/65782539/569146 +def get_nested_val(dictionary, path, *default): + try: + return functools.reduce(lambda x, y: x[y], path.split("."), dictionary) + except KeyError: + if default: + return default[0] + raise diff --git a/tests/lib/then_steps.py b/tests/lib/then_steps.py index 2dadf82e..627cb323 100644 --- a/tests/lib/then_steps.py +++ b/tests/lib/then_steps.py @@ -15,6 +15,7 @@ from jrnl.config import scope_config from .helpers import assert_equal_tags_ignoring_order from .helpers import does_directory_contain_files from .helpers import parse_should_or_should_not +from .helpers import get_nested_val @then("we should get no error") @@ -110,17 +111,18 @@ def should_see_the_message(text, cli_run): ) @then(parse('the config {should_or_should_not} contain "{some_yaml}"')) @then(parse("the config {should_or_should_not} contain\n{some_yaml}")) -def config_var(config_data, journal_name, should_or_should_not, some_yaml): +def config_var_on_disk(config_on_disk, journal_name, should_or_should_not, some_yaml): we_should = parse_should_or_should_not(should_or_should_not) - actual = config_data + actual = config_on_disk if journal_name: actual = actual["journals"][journal_name] - expected = yaml.load(some_yaml, Loader=yaml.FullLoader) + expected = yaml.load(some_yaml, Loader=yaml.SafeLoader) actual_slice = actual if type(actual) is dict: + # `expected` objects formatted in yaml only compare one level deep actual_slice = {key: actual.get(key, None) for key in expected.keys()} if we_should: @@ -129,6 +131,40 @@ def config_var(config_data, journal_name, should_or_should_not, some_yaml): assert expected != actual_slice +@then( + parse( + 'the config in memory for journal "{journal_name}" {should_or_should_not} contain "{some_yaml}"' + ) +) +@then( + parse( + 'the config in memory for journal "{journal_name}" {should_or_should_not} contain\n{some_yaml}' + ) +) +@then(parse('the config in memory {should_or_should_not} contain "{some_yaml}"')) +@then(parse("the config in memory {should_or_should_not} contain\n{some_yaml}")) +def config_var_in_memory( + config_in_memory, journal_name, should_or_should_not, some_yaml +): + we_should = parse_should_or_should_not(should_or_should_not) + + actual = config_in_memory["overrides"] + if journal_name: + actual = actual["journals"][journal_name] + + expected = yaml.load(some_yaml, Loader=yaml.SafeLoader) + + actual_slice = actual + if type(actual) is dict: + # `expected` objects formatted in yaml only compare one level deep + actual_slice = {key: get_nested_val(actual, key) for key in expected.keys()} + + if we_should: + assert expected == actual_slice + else: + assert expected != actual_slice + + @then("we should be prompted for a password") def password_was_called(cli_run): assert cli_run["mocks"]["getpass"].called @@ -145,15 +181,15 @@ def assert_dir_contains_files(file_list, cache_dir): @then(parse("the journal directory should contain\n{file_list}")) -def journal_directory_should_contain(config_data, file_list): - scoped_config = scope_config(config_data, "default") +def journal_directory_should_contain(config_on_disk, file_list): + scoped_config = scope_config(config_on_disk, "default") assert does_directory_contain_files(file_list, scoped_config["journal"]) @then(parse('journal "{journal_name}" should not exist')) -def journal_directory_should_not_exist(config_data, journal_name): - scoped_config = scope_config(config_data, journal_name) +def journal_directory_should_not_exist(config_on_disk, journal_name): + scoped_config = scope_config(config_on_disk, journal_name) assert not does_directory_contain_files( scoped_config["journal"], "." @@ -161,8 +197,8 @@ def journal_directory_should_not_exist(config_data, journal_name): @then(parse("the journal {should_or_should_not} exist")) -def journal_should_not_exist(config_data, should_or_should_not): - scoped_config = scope_config(config_data, "default") +def journal_should_not_exist(config_on_disk, should_or_should_not): + scoped_config = scope_config(config_on_disk, "default") expected_path = scoped_config["journal"] contains_files = does_directory_contain_files(expected_path, ".") diff --git a/tests/lib/when_steps.py b/tests/lib/when_steps.py index 642249e9..80d8a7fb 100644 --- a/tests/lib/when_steps.py +++ b/tests/lib/when_steps.py @@ -34,6 +34,7 @@ def when_we_change_directory(directory_name): def we_run( command, config_path, + config_in_memory, user_input, cli_run, capsys, @@ -63,7 +64,19 @@ def we_run( password = user_input with ExitStack() as stack: + # Always mock + from jrnl.override import apply_overrides + def my_overrides(*args, **kwargs): + result = apply_overrides(*args, **kwargs) + config_in_memory["overrides"] = result + return result + + stack.enter_context( + patch("jrnl.jrnl.apply_overrides", side_effect=my_overrides) + ) + + # Conditionally mock stack.enter_context(patch("sys.argv", ["jrnl"] + args)) mock_stdin = stack.enter_context( diff --git a/tests/unit/test_override.py b/tests/unit/test_override.py index d22709f4..2719e884 100644 --- a/tests/unit/test_override.py +++ b/tests/unit/test_override.py @@ -6,6 +6,8 @@ from jrnl.override import _get_key_and_value_from_pair from jrnl.override import _recursively_apply from jrnl.override import apply_overrides +from argparse import Namespace + @pytest.fixture() def minimal_config(): @@ -18,31 +20,61 @@ def minimal_config(): return cfg +def expected_args(overrides): + default_args = { + "contains": None, + "debug": False, + "delete": False, + "edit": False, + "end_date": None, + "today_in_history": False, + "month": None, + "day": None, + "year": None, + "excluded": [], + "export": False, + "filename": None, + "limit": None, + "on_date": None, + "preconfig_cmd": None, + "postconfig_cmd": None, + "short": False, + "starred": False, + "start_date": None, + "strict": False, + "tags": False, + "text": [], + "config_override": [], + } + return Namespace(**{**default_args, **overrides}) + + def test_apply_override(minimal_config): - overrides = [["editor", "nano"]] - apply_overrides(overrides, minimal_config) + overrides = {"config_override": [["editor", "nano"]]} + apply_overrides(expected_args(overrides), minimal_config) assert minimal_config["editor"] == "nano" def test_override_dot_notation(minimal_config): - overrides = [["colors.body", "blue"]] - - cfg = apply_overrides(overrides=overrides, base_config=minimal_config) - assert cfg["colors"] == {"body": "blue", "date": "green"} + overrides = {"config_override": [["colors.body", "blue"]]} + apply_overrides(expected_args(overrides), minimal_config) + assert minimal_config["colors"] == {"body": "blue", "date": "green"} def test_multiple_overrides(minimal_config): - overrides = [ - ["colors.title", "magenta"], - ["editor", "nano"], - ["journals.burner", "/tmp/journals/burner.jrnl"], - ] # as returned by parse_args, saved in parser.config_override + overrides = { + "config_override": [ + ["colors.title", "magenta"], + ["editor", "nano"], + ["journals.burner", "/tmp/journals/burner.jrnl"], + ] + } - cfg = apply_overrides(overrides, minimal_config) - assert cfg["editor"] == "nano" - assert cfg["colors"]["title"] == "magenta" - assert "burner" in cfg["journals"] - assert cfg["journals"]["burner"] == "/tmp/journals/burner.jrnl" + actual = apply_overrides(expected_args(overrides), minimal_config) + assert actual["editor"] == "nano" + assert actual["colors"]["title"] == "magenta" + assert "burner" in actual["journals"] + assert actual["journals"]["burner"] == "/tmp/journals/burner.jrnl" def test_recursively_apply(): From d347dac19e7e37ad644cd5678ef9a03f7453094d Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 9 Oct 2021 19:11:41 +0000 Subject: [PATCH 10/36] Update changelog [ci skip] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c47711d7..385e1622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ [Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.3...HEAD) +**Build:** + +- Add more steps to `pytest`, fully remove `behave` [\#1347](https://github.com/jrnl-org/jrnl/pull/1347) ([wren](https://github.com/wren)) + **Documentation:** - Document folder journal and DayOne journal types [\#1326](https://github.com/jrnl-org/jrnl/issues/1326) From ae1ad398067f48760aefe0334499fcc31c07626a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Oct 2021 13:20:14 -0700 Subject: [PATCH 11/36] Bump mkdocs from 1.2.2 to 1.2.3 (#1355) Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/mkdocs/mkdocs/releases) - [Commits](https://github.com/mkdocs/mkdocs/compare/1.2.2...1.2.3) --- updated-dependencies: - dependency-name: mkdocs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8c86d892..939ba6c3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -397,7 +397,7 @@ python-versions = ">=3.6" [[package]] name = "mkdocs" -version = "1.2.2" +version = "1.2.3" description = "Project documentation with Markdown." category = "dev" optional = false @@ -938,6 +938,11 @@ cffi = [ {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, + {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, + {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, @@ -1061,12 +1066,22 @@ markdown = [ {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1075,14 +1090,21 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1092,6 +1114,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, @@ -1109,8 +1134,8 @@ mergedeep = [ {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] mkdocs = [ - {file = "mkdocs-1.2.2-py3-none-any.whl", hash = "sha256:d019ff8e17ec746afeb54eb9eb4112b5e959597aebc971da46a5c9486137f0ff"}, - {file = "mkdocs-1.2.2.tar.gz", hash = "sha256:a334f5bd98ec960638511366eb8c5abc9c99b9083a0ed2401d8791b112d6b078"}, + {file = "mkdocs-1.2.3-py3-none-any.whl", hash = "sha256:a1fa8c2d0c1305d7fc2b9d9f607c71778572a8b110fb26642aa00296c9e6d072"}, + {file = "mkdocs-1.2.3.tar.gz", hash = "sha256:89f5a094764381cda656af4298727c9f53dc3e602983087e1fe96ea1df24f4c1"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1229,18 +1254,26 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, From 62dc037d80cab45ab5d3677f83503bc0ab63b840 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 16 Oct 2021 20:22:04 +0000 Subject: [PATCH 12/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 385e1622..a1df5f26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ **Packaging:** +- Bump mkdocs from 1.2.2 to 1.2.3 [\#1355](https://github.com/jrnl-org/jrnl/pull/1355) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump pytz from 2021.1 to 2021.3 [\#1348](https://github.com/jrnl-org/jrnl/pull/1348) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump cryptography from 3.4.8 to 35.0.0 [\#1345](https://github.com/jrnl-org/jrnl/pull/1345) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.8b0 to 21.9b0 [\#1343](https://github.com/jrnl-org/jrnl/pull/1343) ([dependabot[bot]](https://github.com/apps/dependabot)) From 9f5c2f682998a9bf55bb8cfe0c9ce02ff89df093 Mon Sep 17 00:00:00 2001 From: Fidel H Viegas <290857+viegasfh@users.noreply.github.com> Date: Sat, 16 Oct 2021 21:52:13 +0100 Subject: [PATCH 13/36] Add recipe for visualizing Markdown in the CLI (#1354) * Added Recipe for visualizing Markdown in the CLI, fixed some typos and added backticks in all references of jrnl * mdless recipe changes during review -condense language -make it sound less like an endorsement -add link about less -minor grammatical change Co-authored-by: Fidel H Viegas Co-authored-by: Micah Jerome Ellison --- docs/recipes.md | 78 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/docs/recipes.md b/docs/recipes.md index 1a1097d6..4c19611c 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -28,7 +28,7 @@ You can do things like jrnl @fixed -starred -n 10 -to "jan 2013" --short ``` -To get a short summary of the 10 most recent, favourited entries before +To get a short summary of the 10 most recent, favourite entries before January 1, 2013 that are tagged with `@fixed`. ### Statistics @@ -52,8 +52,8 @@ print exactly one line per entry). ### Importing older files -If you want to import a file as an entry to jrnl, you can just do `jrnl < entry.ext`. But what if you want the modification date of the file to -be the date of the entry in jrnl? Try this +If you want to import a file as an entry to `jrnl`, you can just do `jrnl < entry.ext`. But what if you want the modification date of the file to +be the date of the entry in `jrnl`? Try this ```sh echo `stat -f %Sm -t '%d %b %Y at %H:%M: ' entry.txt` `cat entry.txt` | jrnl @@ -73,11 +73,11 @@ jrnlimport () { ### Using templates !!! note - Templates require an [external editor](./advanced.md) be configured. + Templates require an [external editor](./advanced.md) be configured. -A template is a code snippet that makes it easier to use repeated text +A template is a code snippet that makes it easier to use repeated text each time a new journal entry is started. There are two ways you can utilize -templates in your entries. +templates in your entries. #### 1. Command line arguments @@ -85,17 +85,17 @@ If you had a `template.txt` file with the following contents: ```sh My Personal Journal -Title: +Title: Body: ``` -The `template.txt` file could be used to create a new entry with these -command line arguements: +The `template.txt` file could be used to create a new entry with these +command line arguments: ```sh jrnl < template.txt # Imports template.txt as the most recent entry -jrnl -1 --edit # Opens the most recent entry in the editor +jrnl -1 --edit # Opens the most recent entry in the editor ``` #### 2. Include the template file in `jrnl.yaml` @@ -113,8 +113,8 @@ template: "/path/to/template.txt" Changes can be saved as you continue writing the journal entry and will be logged as a new entry in the journal you specified in the original argument. -!!! tip - To read your journal entry or to verify the entry saved, you can use this +!!! tip + To read your journal entry or to verify the entry saved, you can use this command: `jrnl -n 1` (Check out [Formats](./formats.md) for more options). ```sh @@ -137,9 +137,9 @@ log_question 'What did I achieve today?' log_question 'What did I make progress with?' ``` -Whenever your shell is reloaded, you will be prompted to answer each of the -questions in the example above. Each answer will be logged as a separate -journal entry at the `default_hour` and `default_minute` listed in your +Whenever your shell is reloaded, you will be prompted to answer each of the +questions in the example above. Each answer will be logged as a separate +journal entry at the `default_hour` and `default_minute` listed in your `jrnl.yaml` [config file](../advanced/#configuration-file). ### Display random entry @@ -155,16 +155,16 @@ jrnl -on "$(jrnl --short | shuf -n 1 | cut -d' ' -f1,2)" ``` -### Launch a terminal for rapid logging -You can use this to launch a terminal that is the `jrnl` stdin prompt so you can start typing away immediately. +### Launch a terminal for rapid logging +You can use this to launch a terminal that is the `jrnl` stdin prompt so you can start typing away immediately. ```bash jrnl now --config-override editor:"" ``` -Bind this to a keyboard shortcut. +Bind this to a keyboard shortcut. -Map `Super+Alt+J` to launch the terminal with jrnl prompt +Map `Super+Alt+J` to launch the terminal with `jrnl` prompt - **xbindkeys** In your `.xbindkeysrc` @@ -180,11 +180,37 @@ Mod4+Mod1+j bindsym Mod4+Mod1+j exec --no-startup-id alacritty -t floating-jrnl -e jrnl --config-override editor:"" for_window[title="floating *"] floating enable ``` +### Visualize Formatted Markdown in the CLI + +Out of the box, `jrnl` can output journal entries in Markdown. To visualize it, you can pipe to [mdless](https://github.com/ttscoff/mdless), which is a [less](https://en.wikipedia.org/wiki/Less_(Unix))-like tool that allows you to visualize your Markdown text with formatting and syntax highlighting from the CLI. You can use this in any shell that supports piping. + +The simplest way to visualize your Markdown output with `mdless` is as follows: +```sh +jrnl --export md | mdless +``` + +This will render your Markdown output in the whole screen. + +Fortunately, `mdless` has an option that allows you to adjust the screen width by using the `-w` option as follows: + +```sh +jrnl --export md | mdless -w 70 +``` + +If you want Markdown to be your default display format, you can define this in your config file as follows: + +```yaml +display_format: md +# or +display_format: markdown +``` + +For more information on how `jrnl` outputs your entries in Markdown, please visit the [Formats](./formats.md) section. ## External editors -Configure your preferred external editor by updating the `editor` option -in your `jrnl.yaml` file. (See [advanced usage](./advanced.md) for details). +Configure your preferred external editor by updating the `editor` option +in your `jrnl.yaml` file. (See [advanced usage](./advanced.md) for details). !!! note To save and log any entry edits, save and close the file. @@ -201,7 +227,7 @@ tools for Sublime Text and configure your `jrnl.yaml` like this: editor: "subl -w" ``` -Note the `-w` flag to make sure jrnl waits for Sublime Text to close the +Note the `-w` flag to make sure `jrnl` waits for Sublime Text to close the file before writing into the journal. ### Visual Studio Code @@ -252,20 +278,20 @@ grep -A 1 CFBundleIdentifier /Applications/iA\ Writer.app/Contents/Info.plist ### Notepad++ on Windows To set [Notepad++](http://notepad-plus-plus.org/) as your editor, edit -the jrnl config file (`jrnl.yaml`) like this: +the `jrnl` config file (`jrnl.yaml`) like this: ```yaml editor: "C:\\Program Files (x86)\\Notepad++\\notepad++.exe -multiInst -nosession" ``` -The double backslashes are needed so jrnl can read the file path -correctly. The `-multiInst -nosession` options will cause jrnl to open +The double backslashes are needed so `jrnl` can read the file path +correctly. The `-multiInst -nosession` options will cause `jrnl` to open its own Notepad++ window. ### emacs -To use `emacs` as your editor, edit the jrnl config file (`jrnl.yaml`) like this: +To use `emacs` as your editor, edit the `jrnl` config file (`jrnl.yaml`) like this: ```yaml editor: emacsclient -a "" -c From b93b7cdfd6b37d18218221eb43998fc50f30052f Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 16 Oct 2021 20:53:57 +0000 Subject: [PATCH 14/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1df5f26..13ad2db2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ **Documentation:** - Document folder journal and DayOne journal types [\#1326](https://github.com/jrnl-org/jrnl/issues/1326) +- Added Recipe for visualizing Markdown in the CLI [\#1354](https://github.com/jrnl-org/jrnl/pull/1354) ([viegasfh](https://github.com/viegasfh)) - Fix readme splash and add changelog link to readme [\#1339](https://github.com/jrnl-org/jrnl/pull/1339) ([micahellison](https://github.com/micahellison)) - Document journal types [\#1331](https://github.com/jrnl-org/jrnl/pull/1331) ([micahellison](https://github.com/micahellison)) From 156ddee97c18df502635bc2eae3dcdb64aea8d59 Mon Sep 17 00:00:00 2001 From: Gianluca Mondini Date: Sat, 16 Oct 2021 23:37:43 +0200 Subject: [PATCH 15/36] Fix recipe 'Launch a terminal for rapid logging' (#1351) --- docs/recipes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/recipes.md b/docs/recipes.md index 4c19611c..713b38c3 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -159,7 +159,7 @@ jrnl -on "$(jrnl --short | shuf -n 1 | cut -d' ' -f1,2)" You can use this to launch a terminal that is the `jrnl` stdin prompt so you can start typing away immediately. ```bash -jrnl now --config-override editor:"" +jrnl --config-override editor "" ``` Bind this to a keyboard shortcut. @@ -171,13 +171,13 @@ In your `.xbindkeysrc` ```ini Mod4+Mod1+j - alacritty -t floating-jrnl -e jrnl now --config-override editor:"", + alacritty -t floating-jrnl -e jrnl --config-override editor "", ``` - **I3 WM** Launch a floating terminal with the `jrnl` prompt ```ini -bindsym Mod4+Mod1+j exec --no-startup-id alacritty -t floating-jrnl -e jrnl --config-override editor:"" +bindsym Mod4+Mod1+j exec --no-startup-id alacritty -t floating-jrnl -e jrnl --config-override editor "" for_window[title="floating *"] floating enable ``` ### Visualize Formatted Markdown in the CLI From 8cc891a77f823b200e38f382336784d83fe4998d Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 16 Oct 2021 21:39:13 +0000 Subject: [PATCH 16/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ad2db2..0cc8a5e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - Document folder journal and DayOne journal types [\#1326](https://github.com/jrnl-org/jrnl/issues/1326) - Added Recipe for visualizing Markdown in the CLI [\#1354](https://github.com/jrnl-org/jrnl/pull/1354) ([viegasfh](https://github.com/viegasfh)) +- Fix recipe 'Launch a terminal for rapid logging' [\#1351](https://github.com/jrnl-org/jrnl/pull/1351) ([zapateo](https://github.com/zapateo)) - Fix readme splash and add changelog link to readme [\#1339](https://github.com/jrnl-org/jrnl/pull/1339) ([micahellison](https://github.com/micahellison)) - Document journal types [\#1331](https://github.com/jrnl-org/jrnl/pull/1331) ([micahellison](https://github.com/micahellison)) From 533d770753a8ff4ea8272d1d6868cd9153806791 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Oct 2021 14:56:01 -0700 Subject: [PATCH 17/36] Bump pyyaml from 5.4.1 to 6.0 (#1356) Bumps [pyyaml](https://github.com/yaml/pyyaml) from 5.4.1 to 6.0. - [Release notes](https://github.com/yaml/pyyaml/releases) - [Changelog](https://github.com/yaml/pyyaml/blob/master/CHANGES) - [Commits](https://github.com/yaml/pyyaml/compare/5.4.1...6.0) --- updated-dependencies: - dependency-name: pyyaml dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jonathan Wren --- poetry.lock | 330 ++++++++++++++++++++++++++-------------------------- 1 file changed, 162 insertions(+), 168 deletions(-) diff --git a/poetry.lock b/poetry.lock index 939ba6c3..8098c0dd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -99,7 +99,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cffi" -version = "1.14.6" +version = "1.15.0" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -110,7 +110,7 @@ pycparser = "*" [[package]] name = "click" -version = "8.0.1" +version = "8.0.3" description = "Composable command line interface toolkit" category = "dev" optional = false @@ -168,17 +168,17 @@ python-versions = ">=3.5" [[package]] name = "flake8" -version = "3.9.2" +version = "4.0.1" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "ghp-import" @@ -204,7 +204,7 @@ python-versions = "*" [[package]] name = "importlib-metadata" -version = "4.8.1" +version = "4.2.0" description = "Read metadata from Python packages" category = "main" optional = false @@ -216,8 +216,7 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -301,7 +300,7 @@ trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.1" +version = "3.0.2" description = "A very fast and expressive template engine." category = "dev" optional = false @@ -572,11 +571,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.8.0" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycparser" @@ -588,7 +587,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyflakes" -version = "2.3.1" +version = "2.4.0" description = "passive checker of Python programs" category = "dev" optional = false @@ -710,11 +709,11 @@ python-versions = "*" [[package]] name = "pyyaml" -version = "5.4.1" +version = "6.0" description = "YAML parser and emitter for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" [[package]] name = "pyyaml-env-tag" @@ -729,7 +728,7 @@ pyyaml = "*" [[package]] name = "regex" -version = "2021.9.30" +version = "2021.10.8" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -737,11 +736,11 @@ python-versions = "*" [[package]] name = "rich" -version = "10.11.0" +version = "10.12.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6.2,<4.0.0" [package.dependencies] colorama = ">=0.4.0,<0.5.0" @@ -931,55 +930,60 @@ black = [ {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, ] cffi = [ - {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, - {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, - {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, - {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, - {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, - {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, - {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, - {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, - {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, - {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, - {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, - {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, - {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, - {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, - {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, - {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, - {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, - {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, - {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] click = [ - {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, - {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1016,8 +1020,8 @@ decorator = [ {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, ] flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] ghp-import = [ {file = "ghp-import-2.0.2.tar.gz", hash = "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071"}, @@ -1027,8 +1031,8 @@ glob2 = [ {file = "glob2-0.7.tar.gz", hash = "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, - {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1050,8 +1054,8 @@ jeepney = [ {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, + {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, + {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, ] keyring = [ {file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"}, @@ -1066,22 +1070,12 @@ markdown = [ {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1090,21 +1084,14 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1114,9 +1101,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, @@ -1197,16 +1181,16 @@ py = [ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] pycparser = [ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pygments = [ {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, @@ -1248,86 +1232,96 @@ pyxdg = [ {file = "pyxdg-0.27.tar.gz", hash = "sha256:80bd93aae5ed82435f20462ea0208fb198d8eec262e831ee06ce9ddb6b91c5a5"}, ] pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] regex = [ - {file = "regex-2021.9.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66696c8336a1b5d1182464f3af3427cc760118f26d0b09a2ddc16a976a4d2637"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d87459ad3ab40cd8493774f8a454b2e490d8e729e7e402a0625867a983e4e02"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf6a1e023caf5e9a982f5377414e1aeac55198831b852835732cfd0a0ca5ff"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:255791523f80ea8e48e79af7120b4697ef3b74f6886995dcdb08c41f8e516be0"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e502f8d4e5ef714bcc2c94d499684890c94239526d61fdf1096547db91ca6aa6"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4907fb0f9b9309a5bded72343e675a252c2589a41871874feace9a05a540241e"}, - {file = "regex-2021.9.30-cp310-cp310-win32.whl", hash = "sha256:3be40f720af170a6b20ddd2ad7904c58b13d2b56f6734ee5d09bbdeed2fa4816"}, - {file = "regex-2021.9.30-cp310-cp310-win_amd64.whl", hash = "sha256:c2b180ed30856dfa70cfe927b0fd38e6b68198a03039abdbeb1f2029758d87e7"}, - {file = "regex-2021.9.30-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6f2d2f93001801296fe3ca86515eb04915472b5380d4d8752f09f25f0b9b0ed"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa7ba9ab2eba7284e0d7d94f61df7af86015b0398e123331362270d71fab0b9"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28040e89a04b60d579c69095c509a4f6a1a5379cd865258e3a186b7105de72c6"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f588209d3e4797882cd238195c175290dbc501973b10a581086b5c6bcd095ffb"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42952d325439ef223e4e9db7ee6d9087b5c68c5c15b1f9de68e990837682fc7b"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cae4099031d80703954c39680323dabd87a69b21262303160776aa0e55970ca0"}, - {file = "regex-2021.9.30-cp36-cp36m-win32.whl", hash = "sha256:0de8ad66b08c3e673b61981b9e3626f8784d5564f8c3928e2ad408c0eb5ac38c"}, - {file = "regex-2021.9.30-cp36-cp36m-win_amd64.whl", hash = "sha256:b345ecde37c86dd7084c62954468a4a655fd2d24fd9b237949dd07a4d0dd6f4c"}, - {file = "regex-2021.9.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6f08187136f11e430638c2c66e1db091105d7c2e9902489f0dbc69b44c222b4"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55442650f541d195a535ccec33078c78a9521973fb960923da7515e9ed78fa6"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e9c489aa98f50f367fb26cc9c8908d668e9228d327644d7aa568d47e456f47"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2cb7d4909ed16ed35729d38af585673f1f0833e73dfdf0c18e5be0061107b99"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0861e7f6325e821d5c40514c551fd538b292f8cc3960086e73491b9c5d8291d"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:81fdc90f999b2147fc62e303440c424c47e5573a9b615ed5d43a5b832efcca9e"}, - {file = "regex-2021.9.30-cp37-cp37m-win32.whl", hash = "sha256:8c1ad61fa024195136a6b7b89538030bd00df15f90ac177ca278df9b2386c96f"}, - {file = "regex-2021.9.30-cp37-cp37m-win_amd64.whl", hash = "sha256:e3770781353a4886b68ef10cec31c1f61e8e3a0be5f213c2bb15a86efd999bc4"}, - {file = "regex-2021.9.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c065d95a514a06b92a5026766d72ac91bfabf581adb5b29bc5c91d4b3ee9b83"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9925985be05d54b3d25fd6c1ea8e50ff1f7c2744c75bdc4d3b45c790afa2bcb3"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470f2c882f2672d8eeda8ab27992aec277c067d280b52541357e1acd7e606dae"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad0517df22a97f1da20d8f1c8cb71a5d1997fa383326b81f9cf22c9dadfbdf34"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e30838df7bfd20db6466fd309d9b580d32855f8e2c2e6d74cf9da27dcd9b63"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b34d2335d6aedec7dcadd3f8283b9682fadad8b9b008da8788d2fce76125ebe"}, - {file = "regex-2021.9.30-cp38-cp38-win32.whl", hash = "sha256:e07049cece3462c626d650e8bf42ddbca3abf4aa08155002c28cb6d9a5a281e2"}, - {file = "regex-2021.9.30-cp38-cp38-win_amd64.whl", hash = "sha256:37868075eda024470bd0feab872c692ac4ee29db1e14baec103257bf6cc64346"}, - {file = "regex-2021.9.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d331f238a7accfbbe1c4cd1ba610d4c087b206353539331e32a8f05345c74aec"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6348a7ab2a502cbdd0b7fd0496d614007489adb7361956b38044d1d588e66e04"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b1cca6c23f19bee8dc40228d9c314d86d1e51996b86f924aca302fc8f8bf9"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f1125bc5172ab3a049bc6f4b9c0aae95a2a2001a77e6d6e4239fa3653e202b5"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:638e98d069b14113e8afba6a54d1ca123f712c0d105e67c1f9211b2a825ef926"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a0b0db6b49da7fa37ca8eddf9f40a8dbc599bad43e64f452284f37b6c34d91c"}, - {file = "regex-2021.9.30-cp39-cp39-win32.whl", hash = "sha256:9910869c472e5a6728680ca357b5846546cbbd2ab3ad5bef986ef0bc438d0aa6"}, - {file = "regex-2021.9.30-cp39-cp39-win_amd64.whl", hash = "sha256:3b71213ec3bad9a5a02e049f2ec86b3d7c3e350129ae0f4e2f99c12b5da919ed"}, - {file = "regex-2021.9.30.tar.gz", hash = "sha256:81e125d9ba54c34579e4539a967e976a3c56150796674aec318b1b2f49251be7"}, + {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:094a905e87a4171508c2a0e10217795f83c636ccc05ddf86e7272c26e14056ae"}, + {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, + {file = "regex-2021.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b0f2f874c6a157c91708ac352470cb3bef8e8814f5325e3c5c7a0533064c6a24"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, + {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, + {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, + {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, + {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, + {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, + {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, + {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, + {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, + {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19b8f6d23b2dc93e8e1e7e288d3010e58fafed323474cf7f27ab9451635136d9"}, + {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, + {file = "regex-2021.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:951be934dc25d8779d92b530e922de44dda3c82a509cdb5d619f3a0b1491fafa"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, + {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, + {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, + {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6dcf53d35850ce938b4f044a43b33015ebde292840cef3af2c8eb4c860730fff"}, + {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, + {file = "regex-2021.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2ec1c106d3f754444abf63b31e5c4f9b5d272272a491fa4320475aba9e8157c"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, + {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, + {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, + {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, ] rich = [ - {file = "rich-10.11.0-py3-none-any.whl", hash = "sha256:44bb3f9553d00b3c8938abf89828df870322b9ba43caf3b12bb7758debdc6dec"}, - {file = "rich-10.11.0.tar.gz", hash = "sha256:016fa105f34b69c434e7f908bb5bd7fefa9616efdb218a2917117683a6394ce5"}, + {file = "rich-10.12.0-py3-none-any.whl", hash = "sha256:c30d6808d1cd3defd56a7bd2d587d13e53b5f55de6cf587f035bcbb56bc3f37b"}, + {file = "rich-10.12.0.tar.gz", hash = "sha256:83fb3eff778beec3c55201455c17cccde1ccdf66d5b4dade8ef28f56b50c4bd4"}, ] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, From b1ba88c138b82aa38dc91aa3e621b38d25e49ed8 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 16 Oct 2021 15:21:49 -0700 Subject: [PATCH 18/36] Migrate contributing.md to docs site (#1266) * Initial migration of contributing.md to docs site * Update contributing to include pytest-bdd changes * add top level section support, and h2 support in sidebar * Incorporate latest changes to contributing.md, clean up language and formatting, and check/add links as necessary * Add a link to milestones * Update CONTRIBUTING.md Co-authored-by: Jonathan Wren --- CONTRIBUTING.md | 123 +--------------------------------- docs/contributing.md | 127 ++++++++++++++++++++++++++++++++++++ docs_theme/assets/theme.css | 42 +++++++++--- mkdocs.yml | 19 +++--- 4 files changed, 172 insertions(+), 139 deletions(-) create mode 100644 docs/contributing.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cf9c4f36..93b57d7e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,125 +2,4 @@ License: https://www.gnu.org/licenses/gpl-3.0.html --> # Contributing -We welcome contributions to jrnl, whether it's through reporting bugs, improving the documentation, testing releases, engaging in discussion on features and bugs, or writing code. - -## Table of Contents - * [Code of Conduct](#code-of-conduct) - * [Reporting Bugs](#reporting-bugs) - * [Editing Documentation](#editing-documentation) - * [Testing](#testing) - * [Submitting feature requests and ideas](#submitting-feature-requests-and-ideas) - * [Developing](#developing) - -## Code of Conduct - -Before starting, please read the [Code of Conduct](CODE_OF_CONDUCT.md). - -## Reporting Bugs - -Please report bugs by [opening a new issue](https://github.com/jrnl-org/jrnl/issues/new/choose) and describing it as well as possible. Many bugs are specific to a particular operating system and Python version, so please include that information! - -## Editing Documentation - -If you find a typo or a mistake in the docs, please fix it right away and send a pull request. - -To edit the documentation, edit the `docs/*.md` files on the **develop** branch. You can see the result if you run `make html` (or `poetry run mkdocs serve` if on Windows) inside the project's root directory, then navigating your browser to [localhost:8000](http://localhost:8000). - -The `gh-pages` branch is automatically maintained and generated after your changes are merged. You should never have to edit that branch. - -### Recipes and external editors - -If you'd like to share a jrnl command line trick that you find useful, or advice on how to integrate a particular external editor, you may find it worthwhile to add it to the ["Recipes" section](docs/recipes.md). - -## Testing - -Much of the work of maintaining jrnl involves testing rather than coding. - -The nature of jrnl means we deal with extremely sensitive data, and can't risk data loss. While jrnl does have a comprehensive automated testing suite, user testing is crucial to mitigating this risk. - -### Prereleases - -[Prereleases are deployed through PyPi much like normal releases](https://pypi.org/project/jrnl/#history). You can use [pipx](https://pypi.org/project/pipx/) to fetch them and test them. See the [changelog](CHANGELOG.md) for information on what has changed with each release. - -### Pull requests - -If you are comfortable enough with git, feel free to fetch particular [pull requests](https://github.com/jrnl-org/jrnl/pulls), test them yourself, and report back your findings. Bonus points if you can add a screencast of how the new feature works. - -### Confirm bug reports - -There are always [open bugs among our GitHub issues](https://github.com/jrnl-org/jrnl/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and many are specific to a particular OS, Python version, or jrnl version. A simple comment like "Confirmed on jrnl v2.2, MacOS 10.15, Python 3.8.1" would be extremely helpful in tracking down bugs. - -### Automate tests - -See the develop section below for information on how to contribute new automated tests. - -## Submitting feature requests and ideas - -If you have a feature request or idea for jrnl, please [open a new issue](https://github.com/jrnl-org/jrnl/issues/new/choose) and describe the goal of the feature, and any relevant use cases. We'll discuss the issue with you, and decide if it's a good fit for the project. - -When discussing new features, please keep in mind our design goals. jrnl strives to do one thing well. To us, that means: - -* be _slim_ -* have a simple interface -* avoid duplicating functionality - -## Developing - -### Getting your environment set up - -You will need to install [poetry](https://poetry.eustace.io/) to develop jrnl. It will take care of all of the project's other dependencies. - -### Understanding the branches - -jrnl uses two primary branches: - - * `develop` - for ongoing development - * `release` - for releases - -In general, pull requests should be made on the `develop` branch. - -### Common development commands - -You can find an inventory of commands in the `makefile`. \*nix users can run the commands by typing `make` followed by the name of the command; however, Windows users will need to type out the commands directly, or install a third-party make tool such as [GNU Make for Windows](http://gnuwin32.sourceforge.net/packages/make.htm). - -A typical development workflow includes: - - * Installing dependencies: `poetry install` - * Running tests: `make test` - * Running the source in a virtual environment: - * `poetry shell` - * `jrnl` (with or without arguments as necessary) - * Linting the code to standardize its style: `make lint` - -### Updating automated tests - -When resolving bugs or adding new functionality, please add tests to prevent that functionality from breaking in the future. If you notice any functionality that isn't covered in the tests, feel free to submit a test-only pull request as well. - -For testing, jrnl uses [pytest](https://docs.pytest.org) for unit tests, and [pytest-bdd](https://pytest-bdd.readthedocs.io/) for integration testing. All tests are in the `tests` folder. - -Many tests can be created by only editing `*.feature` files with the same format as other tests. For more complicated functionality, you may need to implement steps in `tests/lib/` which are then executed by your tests in the `feature` files. - -Starting in 2020, jrnl is also using [pytest](https://docs.pytest.org/) for unit tests. These tests are in the `tests` folder. - -### Submitting pull requests - -When you're ready, feel free to submit a pull request (PR). The jrnl maintainers generally review the pull requests every two weeks, but the continuous integration pipeline will run on automated tests on it within a matter of minutes and will report back any issues it has found with your code across a variety of environments. - -The pull request template contains a checklist full of housekeeping items. Please fill them out as necessary when you submit. - -If a pull request contains failing tests, it probably will not be reviewed, and it definitely will not be approved. However, if you need help resolving a failing test, please mention that in your PR. - -### Finding things to work on - -You can search the [jrnl GitHub issues](https://github.com/jrnl-org/jrnl/issues) by [label](https://github.com/jrnl-org/jrnl/labels) for things to work on. Here are some labels worth searching: - -* [critical](https://github.com/jrnl-org/jrnl/labels/critical) -* [help wanted](https://github.com/jrnl-org/jrnl/labels/help%20wanted) -* [bug](https://github.com/jrnl-org/jrnl/labels/bug) -* [enhancement](https://github.com/jrnl-org/jrnl/labels/enhancement) - -### A note for new programmers and programmers new to python - -Although jrnl has grown quite a bit since its inception, the overall complexity (for an end-user program) is fairly low, and we hope you'll find the code easy enough to understand. - -If you have a question, please don't hesitate to ask! Python is known for its welcoming community and openness to novice programmers, so feel free to fork the code and play around with it! If you create something you want to share with us, please create a pull request. We never expect pull requests to be perfect, idiomatic, instantly mergeable code. We can work through it together! +See "[Contributing](docs/contributing.md)" in the `docs` directory. diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 00000000..71c1d337 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,127 @@ + +# Contributing to jrnl + +We welcome contributions to jrnl, whether it's through reporting bugs, improving the documentation, testing releases, engaging in discussion on features and bugs, or writing code. + +## Table of Contents + * [Code of Conduct](#code-of-conduct) + * [Reporting Bugs](#reporting-bugs) + * [Editing Documentation](#editing-documentation) + * [Testing](#testing) + * [Submitting feature requests and ideas](#submitting-feature-requests-and-ideas) + * [Developing jrnl](#developing) + +## Code of Conduct + +Before starting, please read the [Code of Conduct](https://github.com/jrnl-org/jrnl/blob/develop/CODE_OF_CONDUCT.md). + +## Reporting Bugs + +Please report bugs by [opening a new issue](https://github.com/jrnl-org/jrnl/issues/new/choose) and describing it as well as possible. Many bugs are specific to a particular operating system and Python version, so please include that information! + +## Editing Documentation + +If you find a typo or a mistake in the docs, please fix it right away and send a pull request. If you're unsure what to change but still see a problem, you can [open a new issue](https://github.com/jrnl-org/jrnl/issues/new/choose) with the "Documentation change" type. + +To edit the documentation, edit the `docs/*.md` files on the **develop** branch. You can see the result by running `make html` (or `poetry run mkdocs serve` if on Windows) inside the project's root directory, then navigating your browser to [localhost:8000](http://localhost:8000). + +The `gh-pages` branch is automatically maintained and generated after your changes are merged. You should never have to edit that branch. + +### Recipes and external editors + +If you'd like to share a jrnl command line trick that you find useful, or advice on how to integrate a particular external editor, you may find it worthwhile to add it to the ["Recipes" section](recipes.md). + +## Testing + +Much of the work of maintaining jrnl involves testing rather than coding. + +The nature of jrnl means we deal with extremely sensitive data, and can't risk data loss. While jrnl does have a comprehensive automated testing suite, user testing is crucial to mitigating this risk. + +### Prereleases + +[Prereleases are deployed through PyPi much like normal releases](https://pypi.org/project/jrnl/#history). You can use [pipx](https://pypi.org/project/pipx/) to fetch them and test them. See the [changelog](https://github.com/jrnl-org/jrnl/blob/develop/CHANGELOG.md) for information on what has changed with each release. + +### Pull requests + +If you are comfortable enough with git, feel free to fetch particular [pull requests](https://github.com/jrnl-org/jrnl/pulls), test them yourself, and report back your findings. Bonus points if you can add a screencast of how the new feature works. + +### Confirm bug reports + +There are always [open bugs among our GitHub issues](https://github.com/jrnl-org/jrnl/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and many are specific to a particular OS, Python version, or jrnl version. A simple comment like "Confirmed on jrnl v2.2, MacOS 10.15, Python 3.8.1" would be extremely helpful in tracking down bugs. + +### Automate tests + +See the develop section below for information on how to contribute new automated tests. + +## Submitting feature requests and ideas + +If you have a feature request or idea for jrnl, please [open a new issue](https://github.com/jrnl-org/jrnl/issues/new/choose) and describe the goal of the feature, and any relevant use cases. We'll discuss the issue with you, and decide if it's a good fit for the project. + +When discussing new features, please keep in mind our design goals. jrnl strives to +[do one thing well](https://en.wikipedia.org/wiki/Unix_philosophy). To us, that means: + +* being _nimble_ +* having a simple interface +* avoiding duplicating functionality + +## Developing + +### Getting your environment set up + +You will need to install [poetry](https://python-poetry.org/) to develop jrnl. It will take care of all of the project's other dependencies. + +### Understanding the branches + +jrnl uses two primary branches: + + * `develop` - for ongoing development + * `release` - for releases + +In general, pull requests should be made on the `develop` branch. + +### Common development commands + +You can find an inventory of commands in the `makefile`. \*nix users can run the commands by typing `make` followed by the name of the command; however, Windows users will need to type out the commands directly, or install a third-party make tool such as [GNU Make for Windows](http://gnuwin32.sourceforge.net/packages/make.htm). + +A typical development workflow includes: + + * Installing dependencies: `poetry install` + * Running tests: `make test` + * Running the source in a virtual environment: + * `poetry shell` + * `jrnl` (with or without arguments as necessary) + * Linting the code to standardize its style: `make lint` + +### Updating automated tests + +When resolving bugs or adding new functionality, please add tests to prevent that functionality from breaking in the future. If you notice any functionality that isn't covered in the tests, feel free to submit a test-only pull request as well. + +For testing, jrnl uses [pytest](https://docs.pytest.org) for unit tests, and [pytest-bdd](https://pytest-bdd.readthedocs.io/) for integration testing. All tests are in the `tests` folder. + +Many tests can be created by only editing `*.feature` files with the same format as other tests. For more complicated functionality, you may need to implement steps in `tests/lib/` which are then executed by your tests in the `feature` files. + +### Submitting pull requests + +When you're ready, feel free to submit a pull request (PR). The jrnl maintainers generally review the pull requests every two weeks, but the continuous integration pipeline will run on automated tests on it within a matter of minutes and will report back any issues it has found with your code across a variety of environments. + +The pull request template contains a checklist full of housekeeping items. Please fill them out as necessary when you submit. + +If a pull request contains failing tests, it probably will not be reviewed, and it definitely will not be approved. However, if you need help resolving a failing test, please mention that in your PR. + +### Finding things to work on + +You can search the [jrnl GitHub issues](https://github.com/jrnl-org/jrnl/issues) by [label](https://github.com/jrnl-org/jrnl/labels) for things to work on. Here are some labels worth searching: + +* [critical](https://github.com/jrnl-org/jrnl/labels/critical) +* [help wanted](https://github.com/jrnl-org/jrnl/labels/help%20wanted) +* [bug](https://github.com/jrnl-org/jrnl/labels/bug) +* [enhancement](https://github.com/jrnl-org/jrnl/labels/enhancement) + +You can also get a feel for the project's priorities by reviewing the [milestones](https://github.com/jrnl-org/jrnl/milestones). + +### A note for new programmers and programmers new to python + +Although jrnl has grown quite a bit since its inception, the overall complexity (for an end-user program) is fairly low, and we hope you'll find the code easy enough to understand. + +If you have a question, please don't hesitate to ask! Python is known for its welcoming community and openness to novice programmers, so feel free to fork the code and play around with it! If you create something you want to share with us, please create a pull request. We never expect pull requests to be perfect, idiomatic, instantly mergeable code. We can work through it together! diff --git a/docs_theme/assets/theme.css b/docs_theme/assets/theme.css index 491a0baa..d98392e8 100644 --- a/docs_theme/assets/theme.css +++ b/docs_theme/assets/theme.css @@ -51,6 +51,14 @@ h2 { margin-top: 40px; } +h3 { + font-size: 1.1em; +} + +h4 { + font-size: 1em; +} + p, td, tr, @@ -72,8 +80,10 @@ div.rst-content { } .wy-side-nav-search, -.wy-menu-vertical li.current { +.wy-menu-vertical li.current, +.wy-menu-vertical li.toctree-l1.current > a { background-color: transparent; + border: none; } .wy-nav-top { @@ -107,7 +117,8 @@ a.icon-home:before { line-height: 2em; } -.wy-menu-vertical a:hover { +.wy-menu-vertical a:hover, +.wy-menu-vertical li.current a:hover { background-color: var(--black-shadow); color: var(--white); } @@ -119,12 +130,12 @@ a.icon-home:before { position: relative; } -.wy-menu-vertical li.current>a { +.wy-menu-vertical li.current > a.current { background: var(--darkest-purple); border: none !important; } -.wy-menu-vertical li.current>a:hover { +.wy-menu-vertical li.current > a:hover { background: var(--darkest-purple); border: none; } @@ -146,10 +157,12 @@ a.icon-home:before { border-bottom: 1em solid transparent; border-right: 1em solid var(--white); } -.wy-menu-vertical li li.toctree-l2 { - font-weight: 800 !important; + +.wy-menu-vertical li.toctree-l2.current { font-size: 50px; - color: red !important; +} + +.wy-menu-vertical li.toctree-l2.current > a{ } .toctree-expand:before { @@ -161,10 +174,14 @@ a.icon-home:before { display: none; } +.wy-menu-vertical p.caption { + margin-top: 2em; +} + .wy-menu-vertical span { color: var(--white); font-size: 1.2em; - font-weight: 300; + font-weight: 600; } .wy-menu-vertical li a { @@ -207,9 +224,16 @@ form .search-query::placeholder { } .toctree-l2 a:first-child { - display: none; + display: block; } +.wy-menu-vertical li.current ul { + background-color: var(--mid-purple); + border-bottom: 1px solid var(--mid-purple); + border-top: 1px solid var(--dark-purple); +} + + /* ------------------------------------------------------------ */ /* Logo: ; */ /* ------------------------------------------------------------ */ diff --git a/mkdocs.yml b/mkdocs.yml index 348f0a83..5515d0fa 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,11 +18,14 @@ site_author: jrnl contributors site_description: Collect your thoughts and notes without leaving the command line. nav: - Overview: overview.md - - Quickstart: installation.md - - Basic Usage: usage.md - - Encryption: encryption.md - - Journal Types: journal-types.md - - Privacy and Security: privacy-and-security.md - - Formats: formats.md - - Advanced Usage: advanced.md - - Recipes: recipes.md + - 'User Guide': + - Quickstart: installation.md + - Basic Usage: usage.md + - Encryption: encryption.md + - Journal Types: journal-types.md + - Privacy and Security: privacy-and-security.md + - Formats: formats.md + - Advanced Usage: advanced.md + - Recipes: recipes.md + - 'Contributing': + - Contributing to jrnl: contributing.md From 54c9a058df97ced8f2f07d11cba155af25a86446 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 16 Oct 2021 22:23:23 +0000 Subject: [PATCH 19/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cc8a5e1..c2eca1e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ **Documentation:** - Document folder journal and DayOne journal types [\#1326](https://github.com/jrnl-org/jrnl/issues/1326) +- Move and expand contributing.md content into docs site [\#1180](https://github.com/jrnl-org/jrnl/issues/1180) - Added Recipe for visualizing Markdown in the CLI [\#1354](https://github.com/jrnl-org/jrnl/pull/1354) ([viegasfh](https://github.com/viegasfh)) - Fix recipe 'Launch a terminal for rapid logging' [\#1351](https://github.com/jrnl-org/jrnl/pull/1351) ([zapateo](https://github.com/zapateo)) - Fix readme splash and add changelog link to readme [\#1339](https://github.com/jrnl-org/jrnl/pull/1339) ([micahellison](https://github.com/micahellison)) From c68c13ab6e2befa802c493e25de8215eb84120e6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 23 Oct 2021 21:17:32 +0200 Subject: [PATCH 20/36] Switch to poetry-core (#1359) --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 098211e4..c36a5264 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,5 +99,6 @@ filterwarnings = [ extend-ignore = "E101,E111,E114,E115,E116,E117,E12,E13,E2,E3,E401,E5,E70,W1,W2,W3,W5" [build-system] -requires = ["poetry>=1.1"] -build-backend = "poetry.masonry.api" +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + From b4ccf44d3aff38d496e119f576f99c375e626226 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 23 Oct 2021 19:19:39 +0000 Subject: [PATCH 21/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2eca1e1..bfd51aec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ **Build:** +- Switch from poetry to poetry-core [\#1359](https://github.com/jrnl-org/jrnl/pull/1359) ([fabaff](https://github.com/fabaff)) - Add more steps to `pytest`, fully remove `behave` [\#1347](https://github.com/jrnl-org/jrnl/pull/1347) ([wren](https://github.com/wren)) **Documentation:** From 8cabf0f87a09e8c8aa2f336f380c26169df29bda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Nov 2021 13:24:50 -0700 Subject: [PATCH 22/36] Bump black from 21.9b0 to 21.10b0 (#1370) Bumps [black](https://github.com/psf/black) from 21.9b0 to 21.10b0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8098c0dd..f97ee49b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -71,7 +71,7 @@ python-versions = "*" [[package]] name = "black" -version = "21.9b0" +version = "21.10b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -92,9 +92,9 @@ typing-extensions = [ [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -926,8 +926,8 @@ backcall = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, + {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, ] cffi = [ {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, @@ -1070,12 +1070,28 @@ markdown = [ {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1084,14 +1100,27 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1101,6 +1130,12 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, From f608e176c1f1a0d884a1e38684f026787eb4235f Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 20:26:39 +0000 Subject: [PATCH 23/36] Update changelog [ci skip] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfd51aec..8c16ce07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ **Packaging:** +- Bump black from 21.9b0 to 21.10b0 [\#1370](https://github.com/jrnl-org/jrnl/pull/1370) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump mkdocs from 1.2.2 to 1.2.3 [\#1355](https://github.com/jrnl-org/jrnl/pull/1355) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump pytz from 2021.1 to 2021.3 [\#1348](https://github.com/jrnl-org/jrnl/pull/1348) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump cryptography from 3.4.8 to 35.0.0 [\#1345](https://github.com/jrnl-org/jrnl/pull/1345) ([dependabot[bot]](https://github.com/apps/dependabot)) @@ -27,6 +28,7 @@ - Bump keyring from 23.1.0 to 23.2.1 [\#1342](https://github.com/jrnl-org/jrnl/pull/1342) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump pytest from 6.2.4 to 6.2.5 [\#1334](https://github.com/jrnl-org/jrnl/pull/1334) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.7b0 to 21.8b0 [\#1333](https://github.com/jrnl-org/jrnl/pull/1333) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump cryptography from 3.4.7 to 3.4.8 [\#1329](https://github.com/jrnl-org/jrnl/pull/1329) ([dependabot[bot]](https://github.com/apps/dependabot)) ## [v2.8.3](https://pypi.org/project/jrnl/v2.8.3/) (2021-09-06) From 99c19b2a64d416db7f8f047eee7e2814812676c8 Mon Sep 17 00:00:00 2001 From: Ben Beasley Date: Sat, 6 Nov 2021 16:30:25 -0400 Subject: [PATCH 24/36] Support pytest-bdd 5.x (#1365) https://github.com/pytest-dev/pytest-bdd/blob/5.0.0/README.rst#migration-of-your-tests-from-versions-4xx --- tests/lib/then_steps.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lib/then_steps.py b/tests/lib/then_steps.py index 627cb323..b4011938 100644 --- a/tests/lib/then_steps.py +++ b/tests/lib/then_steps.py @@ -74,6 +74,7 @@ def output_should_be_empty(cli_run): assert actual == "" +@then(parse('the output should contain the date "{date}"')) @then('the output should contain the date ""') def output_should_contain_date(date, cli_run): assert date and date in cli_run["stdout"] From e08215677981a9c01f810ce87f873f92ffc86472 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 20:32:07 +0000 Subject: [PATCH 25/36] Update changelog [ci skip] --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c16ce07..0fc161fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ [Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.3...HEAD) +**Fixed bugs:** + +- Support pytest-bdd 5 [\#1364](https://github.com/jrnl-org/jrnl/issues/1364) + **Build:** - Switch from poetry to poetry-core [\#1359](https://github.com/jrnl-org/jrnl/pull/1359) ([fabaff](https://github.com/fabaff)) @@ -28,7 +32,6 @@ - Bump keyring from 23.1.0 to 23.2.1 [\#1342](https://github.com/jrnl-org/jrnl/pull/1342) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump pytest from 6.2.4 to 6.2.5 [\#1334](https://github.com/jrnl-org/jrnl/pull/1334) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.7b0 to 21.8b0 [\#1333](https://github.com/jrnl-org/jrnl/pull/1333) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump cryptography from 3.4.7 to 3.4.8 [\#1329](https://github.com/jrnl-org/jrnl/pull/1329) ([dependabot[bot]](https://github.com/apps/dependabot)) ## [v2.8.3](https://pypi.org/project/jrnl/v2.8.3/) (2021-09-06) From e242aa4ced186529f40eea83667fb2c5c195678e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Nov 2021 13:37:54 -0700 Subject: [PATCH 26/36] Bump pytest-bdd from 4.1.0 to 5.0.0 (#1368) Bumps [pytest-bdd](https://github.com/pytest-dev/pytest-bdd) from 4.1.0 to 5.0.0. - [Release notes](https://github.com/pytest-dev/pytest-bdd/releases) - [Changelog](https://github.com/pytest-dev/pytest-bdd/blob/master/CHANGES.rst) - [Commits](https://github.com/pytest-dev/pytest-bdd/compare/4.1.0...5.0.0) --- updated-dependencies: - dependency-name: pytest-bdd dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index f97ee49b..10f76d81 100644 --- a/poetry.lock +++ b/poetry.lock @@ -645,7 +645,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-bdd" -version = "4.1.0" +version = "5.0.0" description = "BDD for pytest" category = "main" optional = false @@ -1244,8 +1244,8 @@ pytest = [ {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] pytest-bdd = [ - {file = "pytest-bdd-4.1.0.tar.gz", hash = "sha256:304cd2b09923b838d0c2f08331d1f4236a14ef3594efa94e3bdae0f384d3fa5d"}, - {file = "pytest_bdd-4.1.0-py3-none-any.whl", hash = "sha256:7c5221680cec9a97630e1fae6132f4a97c2f86a90914206ee06a55ae1a409fe5"}, + {file = "pytest-bdd-5.0.0.tar.gz", hash = "sha256:fab7093ed3d5e51ee0c68de093c90e4f40de345bd9a54a188b2991ce2a2a39cf"}, + {file = "pytest_bdd-5.0.0-py3-none-any.whl", hash = "sha256:c7cf12209606421f61f36b5dc63beccd0c82d29446c0592cf68af2dad0a9761d"}, ] pytest-clarity = [ {file = "pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772"}, From 5057c290c19a0e595b0f2d00d433b21ee22653e9 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 20:39:19 +0000 Subject: [PATCH 27/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fc161fa..864b07d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ **Packaging:** - Bump black from 21.9b0 to 21.10b0 [\#1370](https://github.com/jrnl-org/jrnl/pull/1370) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump pytest-bdd from 4.1.0 to 5.0.0 [\#1368](https://github.com/jrnl-org/jrnl/pull/1368) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump mkdocs from 1.2.2 to 1.2.3 [\#1355](https://github.com/jrnl-org/jrnl/pull/1355) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump pytz from 2021.1 to 2021.3 [\#1348](https://github.com/jrnl-org/jrnl/pull/1348) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump cryptography from 3.4.8 to 35.0.0 [\#1345](https://github.com/jrnl-org/jrnl/pull/1345) ([dependabot[bot]](https://github.com/apps/dependabot)) From ae009099ed8b69c2f311dc44f68551ee35c2a318 Mon Sep 17 00:00:00 2001 From: samuelgregorovic <47627184+samuelgregorovic@users.noreply.github.com> Date: Sat, 6 Nov 2021 22:12:34 +0100 Subject: [PATCH 28/36] Add --config-file argument to use alternate config file at runtime (#1290) * added new CLI argument option --config-file * pass argument and fetch alt config file if specified * argparse argument setting update * argument alias --cf added * documentation update - usage of CLI argument * fixed name-clash + unit tests * feature test added * #1170-alternate-config-file: Auto stash before rebase of "refs/heads/#1170-alternate-config-file" * Update docs/advanced.md Co-authored-by: Jonathan Wren * BDD tests added * Begin migrating/rewording --cf tests in pytest-bdd. Uses current directory instead of deep directory structure, but requires a given for each config file referenced * Fix issue where specifying a config-file that needs to be upgraded ended up upgrading the user config file instead * Uncomment and rework remaining tests for pytest-bdd instead of behave * Fix copytree for Python 3.7 (which doesn't support dirs_exist_ok) * Minor fixes to alternative config examples * Remove behave tests (behave is no longer in use) * Move config file unit test to unit test dir and use pytext path fixture instead of current directory to find test data * Use explicit "given the config exists" for copying config files instead of shoehorning in "given we use the config" twice * Change when/when to when/and * Clarify scenarios and fix indentation * Confirm primary config file isn't modified when encrypting/decrypting a journal in an alternate config file * Remove try/except on copytree since I'm no longer using the same Co-authored-by: Jonathan Wren Co-authored-by: Micah Jerome Ellison --- docs/advanced.md | 19 ++++++ jrnl/args.py | 25 +++++++ jrnl/config.py | 9 ++- jrnl/install.py | 45 +++++++++---- jrnl/jrnl.py | 2 +- tests/bdd/features/config_file.feature | 92 ++++++++++++++++++++++++++ tests/bdd/test_features.py | 1 + tests/lib/given_steps.py | 8 +++ tests/unit/test_config_file.py | 22 ++++++ tests/unit/test_parse_args.py | 1 + 10 files changed, 209 insertions(+), 15 deletions(-) create mode 100644 tests/bdd/features/config_file.feature create mode 100644 tests/unit/test_config_file.py diff --git a/docs/advanced.md b/docs/advanced.md index b1b7bef0..a9f1fb27 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -85,6 +85,25 @@ jrnl --config-override display_format fancy --config-override linewrap 20 \ ``` +### Using an alternate config + +You can specify an alternate configuration file for the current instance of `jrnl` using `--config-file CONFIG_FILE_PATH` where +`CONFIG_FILE_PATH` is a path to an alternate `jrnl` configuration file. + +#### Examples: + +``` +# Use personalised configuration file for personal journal entries +jrnl --config-file ~/foo/jrnl/personal-config.yaml + +# Use alternate configuration file for work-related entries +jrnl --config-file ~/foo/jrnl/work-config.yaml + +# Use default configuration file (created on installation) +jrnl +``` + + ## Multiple journal files You can configure `jrnl`to use with multiple journals (eg. diff --git a/jrnl/args.py b/jrnl/args.py index 972fe802..604f9c0e 100644 --- a/jrnl/args.py +++ b/jrnl/args.py @@ -337,6 +337,31 @@ def parse_args(args=[]): """, ) + alternate_config = parser.add_argument_group( + "Specifies alternate config to be used", + textwrap.dedent("Applies alternate config for current session"), + ) + + alternate_config.add_argument( + "--config-file", + dest="config_file_path", + type=str, + default="", + help=""" + Overrides default (created when first installed) config file for this command only. + + Examples: \n + \t - Use a work config file for this jrnl entry, call: \n + \t jrnl --config-file /home/user1/work_config.yaml + \t - Use a personal config file stored on a thumb drive: \n + \t jrnl --config-file /media/user1/my-thumb-drive/personal_config.yaml + """, + ) + + alternate_config.add_argument( + "--cf", dest="config_file_path", type=str, default="", help=argparse.SUPPRESS + ) + # Handle '-123' as a shortcut for '-n 123' num = re.compile(r"^-(\d+)$") args = [num.sub(r"-n \1", arg) for arg in args] diff --git a/jrnl/config.py b/jrnl/config.py index a0482405..035fb34a 100644 --- a/jrnl/config.py +++ b/jrnl/config.py @@ -47,9 +47,14 @@ def make_yaml_valid_dict(input: list) -> dict: return runtime_modifications -def save_config(config): +def save_config(config, alt_config_path=None): + """Supply alt_config_path if using an alternate config through --config-file.""" config["version"] = __version__ - with open(get_config_path(), "w", encoding=YAML_FILE_ENCODING) as f: + with open( + alt_config_path if alt_config_path else get_config_path(), + "w", + encoding=YAML_FILE_ENCODING, + ) as f: yaml.safe_dump( config, f, diff --git a/jrnl/install.py b/jrnl/install.py index b0ae2aa1..b2b583cf 100644 --- a/jrnl/install.py +++ b/jrnl/install.py @@ -19,32 +19,53 @@ from .prompt import yesno from .upgrade import is_old_version -def upgrade_config(config): +def upgrade_config(config_data, alt_config_path=None): """Checks if there are keys missing in a given config dict, and if so, updates the config file accordingly. This essentially automatically ports jrnl installations if new config parameters are introduced in later - versions.""" + versions. + Supply alt_config_path if using an alternate config through --config-file.""" default_config = get_default_config() - missing_keys = set(default_config).difference(config) + missing_keys = set(default_config).difference(config_data) if missing_keys: for key in missing_keys: - config[key] = default_config[key] - save_config(config) + config_data[key] = default_config[key] + save_config(config_data, alt_config_path) + config_path = alt_config_path if alt_config_path else get_config_path() print( - f"[Configuration updated to newest version at {get_config_path()}]", + f"[Configuration updated to newest version at {config_path}]", file=sys.stderr, ) -def load_or_install_jrnl(): - """ - If jrnl is already installed, loads and returns a config object. - Else, perform various prompts to install jrnl. - """ +def find_default_config(): config_path = ( get_config_path() if os.path.exists(get_config_path()) else os.path.join(os.path.expanduser("~"), ".jrnl_config") ) + return config_path + + +def find_alt_config(alt_config): + if os.path.exists(alt_config): + return alt_config + else: + print( + "Alternate configuration file not found at path specified.", file=sys.stderr + ) + print("Exiting.", file=sys.stderr) + sys.exit(1) + + +def load_or_install_jrnl(alt_config_path): + """ + If jrnl is already installed, loads and returns a default config object. + If alternate config is specified via --config-file flag, it will be used. + Else, perform various prompts to install jrnl. + """ + config_path = ( + find_alt_config(alt_config_path) if alt_config_path else find_default_config() + ) if os.path.exists(config_path): logging.debug("Reading configuration from file %s", config_path) @@ -68,7 +89,7 @@ def load_or_install_jrnl(): print("Exiting.", file=sys.stderr) sys.exit(1) - upgrade_config(config) + upgrade_config(config, alt_config_path) verify_config_colors(config) else: diff --git a/jrnl/jrnl.py b/jrnl/jrnl.py index bc7e0b88..9d128a3a 100644 --- a/jrnl/jrnl.py +++ b/jrnl/jrnl.py @@ -36,7 +36,7 @@ def run(args): # Load the config, and extract journal name try: - config = install.load_or_install_jrnl() + config = install.load_or_install_jrnl(args.config_file_path) original_config = config.copy() # Apply config overrides diff --git a/tests/bdd/features/config_file.feature b/tests/bdd/features/config_file.feature new file mode 100644 index 00000000..ce4f042b --- /dev/null +++ b/tests/bdd/features/config_file.feature @@ -0,0 +1,92 @@ +Feature: Multiple journals + + Scenario: Read a journal from an alternate config + Given the config "basic_onefile.yaml" exists + And we use the config "multiple.yaml" + When we run "jrnl --cf basic_onefile.yaml -999" + Then the output should not contain "My first entry" # from multiple.yaml + And the output should contain "Lorem ipsum" # from basic_onefile.yaml + + Scenario: Write to default journal by default using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl --cf multiple.yaml this goes to default" + And we run "jrnl -1" + Then the output should not contain "this goes to default" + When we run "jrnl --cf multiple.yaml -1" + Then the output should contain "this goes to default" + + Scenario: Write to specified journal using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl work --cf multiple.yaml a long day in the office" + And we run "jrnl default --cf multiple.yaml -1" + Then the output should contain "But I'm better" + When we run "jrnl work --cf multiple.yaml -1" + Then the output should contain "a long day in the office" + + Scenario: Tell user which journal was used while using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl --cf multiple.yaml work a long day in the office" + Then we should see the message "Entry added to work journal" + + Scenario: Write to specified journal with a timestamp using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl work --cf multiple.yaml 23 july 2012: a long day in the office" + And we run "jrnl --cf multiple.yaml -1" + Then the output should contain "But I'm better" + When we run "jrnl --cf multiple.yaml work -1" + Then the output should contain "a long day in the office" + And the output should contain "2012-07-23" + + Scenario: Write to specified journal without a timestamp but with colon using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl work --cf multiple.yaml : a long day in the office" + And we run "jrnl --cf multiple.yaml -1" + Then the output should contain "But I'm better" + When we run "jrnl --cf multiple.yaml work -1" + Then the output should contain "a long day in the office" + + Scenario: Create new journals as required using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl ideas -1" + Then the output should be empty + When we run "jrnl ideas --cf multiple.yaml 23 july 2012: sell my junk on ebay and make lots of money" + Then the output should contain "Journal 'ideas' created" + When we run "jrnl ideas --cf multiple.yaml -1" + Then the output should contain "sell my junk on ebay and make lots of money" + + Scenario: Don't crash if no default journal is specified using an alternate config + Given the config "bug343.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl --cf bug343.yaml a long day in the office" + Then we should see the message "No default journal configured" + + Scenario: Don't crash if no file exists for a configured encrypted journal using an alternate config + Given the config "multiple.yaml" exists + And we use the config "basic_onefile.yaml" + When we run "jrnl new_encrypted --cf multiple.yaml Adding first entry" and enter + these three eyes + these three eyes + n + Then we should see the message "Encrypted journal 'new_encrypted' created" + + Scenario: Don't overwrite main config when encrypting a journal in an alternate config + Given the config "basic_onefile.yaml" exists + And we use the config "multiple.yaml" + When we run "jrnl --cf basic_onefile.yaml --encrypt" and enter + these three eyes + these three eyes + n + Then we should see the message "Journal encrypted to features/journals/basic_onefile.journal" + And the config should contain "encrypt: false" # multiple.yaml remains unchanged + + Scenario: Don't overwrite main config when decrypting a journal in an alternate config + Given the config "editor_encrypted.yaml" exists + And we use the config "basic_encrypted.yaml" + When we run "jrnl --cf editor_encrypted.yaml --decrypt" + Then the config should contain "encrypt: true" # basic_encrypted remains unchanged diff --git a/tests/bdd/test_features.py b/tests/bdd/test_features.py index 1509e92d..5ef3506e 100644 --- a/tests/bdd/test_features.py +++ b/tests/bdd/test_features.py @@ -1,6 +1,7 @@ from pytest_bdd import scenarios scenarios("features/build.feature") +scenarios("features/config_file.feature") scenarios("features/core.feature") scenarios("features/datetime.feature") scenarios("features/delete.feature") diff --git a/tests/lib/given_steps.py b/tests/lib/given_steps.py index 649d44c5..f3e6b69c 100644 --- a/tests/lib/given_steps.py +++ b/tests/lib/given_steps.py @@ -105,6 +105,14 @@ def we_use_the_config(config_file, temp_dir, working_dir): return config_dest +@given(parse('the config "{config_file}" exists'), target_fixture="config_path") +@given('the config "" exists', target_fixture="config_path") +def config_exists(config_file, temp_dir, working_dir): + config_source = os.path.join(working_dir, "data", "configs", config_file) + config_dest = os.path.join(temp_dir.name, config_file) + shutil.copy2(config_source, config_dest) + + @given(parse('we use the password "{pw}" if prompted'), target_fixture="password") def use_password_forever(pw): return pw diff --git a/tests/unit/test_config_file.py b/tests/unit/test_config_file.py new file mode 100644 index 00000000..04766f4a --- /dev/null +++ b/tests/unit/test_config_file.py @@ -0,0 +1,22 @@ +import pytest +import os + +from jrnl.install import find_alt_config + + +def test_find_alt_config(request): + work_config_path = os.path.join( + request.fspath.dirname, "..", "data", "configs", "basic_onefile.yaml" + ) + found_alt_config = find_alt_config(work_config_path) + assert found_alt_config == work_config_path + + +def test_find_alt_config_not_exist(request): + bad_config_path = os.path.join( + request.fspath.dirname, "..", "data", "configs", "not-existing-config.yaml" + ) + with pytest.raises(SystemExit) as ex: + found_alt_config = find_alt_config(bad_config_path) + assert found_alt_config is not None + assert isinstance(ex.value, SystemExit) diff --git a/tests/unit/test_parse_args.py b/tests/unit/test_parse_args.py index 0725d33d..f408c9aa 100644 --- a/tests/unit/test_parse_args.py +++ b/tests/unit/test_parse_args.py @@ -37,6 +37,7 @@ def expected_args(**kwargs): "tags": False, "text": [], "config_override": [], + "config_file_path": "", } return {**default_args, **kwargs} From a354b1313976284d1c9b11eaa6d012e1a0dbaa44 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 21:14:16 +0000 Subject: [PATCH 29/36] Update changelog [ci skip] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 864b07d0..f5a249e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ [Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.3...HEAD) +**Implemented enhancements:** + +- Specify an alternate config file in the command line [\#1170](https://github.com/jrnl-org/jrnl/issues/1170) +- Add --config-file argument to use alternate config file at runtime [\#1290](https://github.com/jrnl-org/jrnl/pull/1290) ([samuelgregorovic](https://github.com/samuelgregorovic)) + **Fixed bugs:** - Support pytest-bdd 5 [\#1364](https://github.com/jrnl-org/jrnl/issues/1364) From 06ee6db7e7d1862a2298524898d2817d3d6dd829 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 6 Nov 2021 14:18:00 -0700 Subject: [PATCH 30/36] Use Python 3.10 stable in CI (#1362) * Remove special case code needed for Python 3.10 pre-release and try to get Python 3.11 pre-release running on CI * Wrap 3.10 in quotes so it doesn't resolve to 3.1 * Remove pflake --version call that is crashing in Python 3.11-dev * Run poetry update and restore removed flake8 line --- .github/workflows/testing.yaml | 24 ++------ poetry.lock | 106 +++++++++++++++------------------ pyproject.toml | 2 +- 3 files changed, 54 insertions(+), 78 deletions(-) diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index ba999fbe..63e50ea2 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -29,11 +29,11 @@ jobs: if: > ! contains(github.event.head_commit.message, '[ci skip]') runs-on: ${{ matrix.os }} - continue-on-error: ${{ matrix.python-version == '3.10-dev' }} + continue-on-error: ${{ matrix.python-version == '3.11-dev' }} strategy: fail-fast: false matrix: - python-version: [ 3.7, 3.8, 3.9, 3.10-dev ] + python-version: [ 3.7, 3.8, 3.9, '3.10', 3.11-dev ] os: [ ubuntu-latest, macos-latest, windows-latest ] steps: @@ -52,7 +52,6 @@ jobs: key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ matrix.python-version }}-${{ secrets.CACHE_STRING }} - name: Install dependencies - if: ${{ matrix.python-version != '3.10-dev' }} run: | echo '::group::poetry' pip --disable-pip-version-check install poetry @@ -65,29 +64,14 @@ jobs: echo 'DEPS_INSTALLED=true' >> $GITHUB_ENV - - - name: Install dependencies (Prerelease) - if: ${{ matrix.python-version == '3.10-dev' }} - run: | - echo '::group::poetry' - pip --disable-pip-version-check install poetry==1.2.0a2 - poetry config --local virtualenvs.in-project true - echo '::endgroup::' - - echo '::group::Other dependencies' - poetry install --remove-untracked --no-dev --extras testing - echo '::endgroup::' - - echo 'DEPS_INSTALLED=true' >> $GITHUB_ENV - - name: Code formatting (Black) - if: ${{ matrix.python-version != '3.10-dev' && env.DEPS_INSTALLED == 'true' }} + if: ${{ env.DEPS_INSTALLED == 'true' }} run: | poetry run black --version poetry run black --check --diff . - name: Code Style (flake8) - if: ${{ matrix.python-version != '3.10-dev' && env.DEPS_INSTALLED == 'true' }} + if: ${{ env.DEPS_INSTALLED == 'true' }} run: | poetry run pflake8 --version poetry run pflake8 jrnl tests diff --git a/poetry.lock b/poetry.lock index 10f76d81..ca4786d8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -544,7 +544,7 @@ python-versions = "*" [[package]] name = "prompt-toolkit" -version = "3.0.20" +version = "3.0.21" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false @@ -603,11 +603,14 @@ python-versions = ">=3.5" [[package]] name = "pyparsing" -version = "2.4.7" +version = "3.0.0" description = "Python parsing module" category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyproject-flake8" @@ -728,7 +731,7 @@ pyyaml = "*" [[package]] name = "regex" -version = "2021.10.8" +version = "2021.10.23" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -894,8 +897,8 @@ testing = ["pytest", "pytest-bdd", "toml"] [metadata] lock-version = "1.1" -python-versions = ">=3.7.0, <3.11" -content-hash = "fc24941ef7a065e56487518ccab053638f053e49f4e47f1746cd9fbfcef40546" +python-versions = ">=3.7.0, <3.12" +content-hash = "fea1b18eee58b612f2e35f28d633878da8a3637baccc400fb4a795321191123c" [metadata.files] ansiwrap = [ @@ -1204,8 +1207,8 @@ pprintpp = [ {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, - {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, + {file = "prompt_toolkit-3.0.21-py3-none-any.whl", hash = "sha256:62b3d3ea5a3ccee94dc1aac018279cf64866a76837156ebe159b981c42dd20a8"}, + {file = "prompt_toolkit-3.0.21.tar.gz", hash = "sha256:27f13ff4e4850fe8f860b77414c7880f67c6158076a7b099062cc8570f1562e5"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -1232,8 +1235,8 @@ pygments = [ {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.0-py3-none-any.whl", hash = "sha256:d487599e9fb0dc36bee6b5c183c6fc5bd372ce667736f3d430ab7d842a54a35a"}, + {file = "pyparsing-3.0.0.tar.gz", hash = "sha256:001cad8d467e7a9248ef9fd513f5c0d39afcbcb9a43684101853bd0ab962e479"}, ] pyproject-flake8 = [ {file = "pyproject-flake8-0.0.1a2.tar.gz", hash = "sha256:bdeca37f78ecd34bd64a49d3657d53d099f5445831071a31c46e1fe20cd61461"}, @@ -1306,53 +1309,42 @@ pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] regex = [ - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:094a905e87a4171508c2a0e10217795f83c636ccc05ddf86e7272c26e14056ae"}, - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, - {file = "regex-2021.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b0f2f874c6a157c91708ac352470cb3bef8e8814f5325e3c5c7a0533064c6a24"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, - {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, - {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, - {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, - {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, - {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, - {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, - {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, - {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19b8f6d23b2dc93e8e1e7e288d3010e58fafed323474cf7f27ab9451635136d9"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:951be934dc25d8779d92b530e922de44dda3c82a509cdb5d619f3a0b1491fafa"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, - {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, - {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6dcf53d35850ce938b4f044a43b33015ebde292840cef3af2c8eb4c860730fff"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2ec1c106d3f754444abf63b31e5c4f9b5d272272a491fa4320475aba9e8157c"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, - {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, - {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, - {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, + {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"}, + {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"}, + {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"}, + {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"}, + {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"}, + {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"}, + {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"}, + {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"}, + {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"}, + {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"}, + {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"}, + {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"}, + {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"}, + {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"}, + {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"}, + {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"}, ] rich = [ {file = "rich-10.12.0-py3-none-any.whl", hash = "sha256:c30d6808d1cd3defd56a7bd2d587d13e53b5f55de6cf587f035bcbb56bc3f37b"}, diff --git a/pyproject.toml b/pyproject.toml index c36a5264..288e4ae9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ "Funding" = "https://opencollective.com/jrnl" [tool.poetry.dependencies] -python = ">=3.7.0, <3.11" +python = ">=3.7.0, <3.12" ansiwrap = "^0.8.4" asteval = "^0.9" From 93d59edb670fb173658baeaa53704092fce8abb1 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 21:19:41 +0000 Subject: [PATCH 31/36] Update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5a249e7..1cee5260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ **Build:** +- Use Python 3.10 stable in CI [\#1362](https://github.com/jrnl-org/jrnl/pull/1362) ([micahellison](https://github.com/micahellison)) - Switch from poetry to poetry-core [\#1359](https://github.com/jrnl-org/jrnl/pull/1359) ([fabaff](https://github.com/fabaff)) - Add more steps to `pytest`, fully remove `behave` [\#1347](https://github.com/jrnl-org/jrnl/pull/1347) ([wren](https://github.com/wren)) From 7a70bbc51e96f1ca5c59c3a291ddb911418cd100 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 21:25:54 +0000 Subject: [PATCH 32/36] Increment version to v2.8.4-beta --- jrnl/__version__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jrnl/__version__.py b/jrnl/__version__.py index e0822e62..5b641fa2 100644 --- a/jrnl/__version__.py +++ b/jrnl/__version__.py @@ -1 +1 @@ -__version__ = "v2.8.3" +__version__ = "v2.8.4-beta" diff --git a/pyproject.toml b/pyproject.toml index 288e4ae9..4cc14b5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "jrnl" -version = "v2.8.3" +version = "v2.8.4-beta" description = "Collect your thoughts and notes without leaving the command line." authors = [ "jrnl contributors ", From bbfa32a115bdee9037415cacf00a30d641d9cb01 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 6 Nov 2021 21:27:23 +0000 Subject: [PATCH 33/36] Update changelog [ci skip] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cee5260..e409ea01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Changelog -## [Unreleased](https://github.com/jrnl-org/jrnl/) +## [v2.8.4-beta](https://pypi.org/project/jrnl/v2.8.4-beta/) (2021-11-06) -[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.3...HEAD) +[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.3...v2.8.4-beta) **Implemented enhancements:** From 55dd9484c9916b88e4f2f15b4003e2b9b9426895 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Nov 2021 11:48:27 -0800 Subject: [PATCH 34/36] Bump mkdocs from 1.1 to 1.2.3 in /docs_theme (#1360) Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.1 to 1.2.3. - [Release notes](https://github.com/mkdocs/mkdocs/releases) - [Commits](https://github.com/mkdocs/mkdocs/compare/1.1...1.2.3) --- updated-dependencies: - dependency-name: mkdocs dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs_theme/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_theme/requirements.txt b/docs_theme/requirements.txt index 33dff294..fe9469e7 100644 --- a/docs_theme/requirements.txt +++ b/docs_theme/requirements.txt @@ -1 +1 @@ -mkdocs==1.1 +mkdocs==1.2.3 From 5e45f305ac71117a453c711a2b75e3366d5e7ec9 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 13 Nov 2021 14:52:42 -0800 Subject: [PATCH 35/36] Use full Python version for GitHub Actions cache key (#1373) --- .github/workflows/testing.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index 63e50ea2..27d839f2 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -45,11 +45,14 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: poetry cache # Change CACHE_STRING secret to bust the cache. Useful with minor Python version changes. + - name: Capture full Python version in env + run: echo "PYTHON_FULL_VERSION=$(python --version)" >> $GITHUB_ENV + + - name: poetry cache # Change CACHE_STRING secret to bust the cache uses: actions/cache@v2 with: path: .venv - key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ matrix.python-version }}-${{ secrets.CACHE_STRING }} + key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ env.PYTHON_FULL_VERSION }}-${{ secrets.CACHE_STRING }} - name: Install dependencies run: | From ffc8bdd5f1fe86a400a0f2530116394f0df444a0 Mon Sep 17 00:00:00 2001 From: Jrnl Bot Date: Sat, 13 Nov 2021 22:54:50 +0000 Subject: [PATCH 36/36] Update changelog [ci skip] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e409ea01..0ea89d0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [Unreleased](https://github.com/jrnl-org/jrnl/) + +[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.4-beta...HEAD) + +**Build:** + +- Use full Python version for GitHub Actions cache key [\#1373](https://github.com/jrnl-org/jrnl/pull/1373) ([micahellison](https://github.com/micahellison)) + ## [v2.8.4-beta](https://pypi.org/project/jrnl/v2.8.4-beta/) (2021-11-06) [Full Changelog](https://github.com/jrnl-org/jrnl/compare/v2.8.3...v2.8.4-beta)