Compare commits

...

145 commits

Author SHA1 Message Date
Jrnl Bot
7923e815f7 Update changelog [ci skip] 2025-04-29 03:08:35 +00:00
Micah Jerome Ellison
72d4968471
Rename Poetry dev dependency group in pyproject.toml (#1995)
* Rename pyproject group to comply with poetry

* Run poetry lock
2025-04-28 20:06:32 -07:00
Jrnl Bot
c286012bef Update changelog [ci skip] 2025-04-29 02:36:25 +00:00
Micah Jerome Ellison
c415c68443
Remove publish-to-homebrew step (#1994) 2025-04-28 19:34:45 -07:00
Jrnl Bot
e5fc8be2a8 Update changelog [ci skip] 2025-04-04 02:17:55 +00:00
renovate[bot]
20a087f64c
Update dependency rich to v14 (#1989)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:16:22 -07:00
Jrnl Bot
a2eb68963b Update changelog [ci skip] 2025-04-04 02:14:52 +00:00
renovate[bot]
89be61ccf8
Update dependency tox to v4.25.0 (#1986)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:13:03 -07:00
renovate[bot]
98d0bcac20
Update dependency poethepoet to v0.33.1 (#1982)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:12:40 -07:00
renovate[bot]
a282440118
Update dependency tzlocal to v5.3.1 (#1984)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:11:56 -07:00
renovate[bot]
7e72386da1
Update dependency cryptography to v44.0.2 (#1980)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:11:15 -07:00
renovate[bot]
6f1e8e5853
Update dependency jinja2 to v3.1.6 (#1983)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:10:43 -07:00
renovate[bot]
906a3fed78
Update dependency pytest to v8.3.5 (#1981)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 19:10:15 -07:00
Edoardo Baldi
8329cf5537
Add user-friendly message when missing importer (#1959) 2025-04-03 18:48:04 -07:00
Jrnl Bot
1dd2d48068 Update changelog [ci skip] 2025-04-04 01:35:11 +00:00
renovate[bot]
43310f399d
Update dependency ruff to v0.11.3 (#1978)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 18:33:25 -07:00
renovate[bot]
591f2457c3
Update dependency python to 3.13 (#1988)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-03 18:32:32 -07:00
Jrnl Bot
8be5b722aa Update changelog [ci skip] 2025-02-25 05:03:32 +00:00
Jrnl Bot
7249adb232 Increment version to v4.2.1 2025-02-25 05:02:27 +00:00
Jrnl Bot
fbd1b9e78b Update changelog [ci skip] 2025-02-25 05:00:06 +00:00
renovate[bot]
2581c43ae7
Update dependency pytest-bdd to v8.1.0 (#1952)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:58:12 -08:00
renovate[bot]
2035619587
Update dependency poethepoet to v0.32.2 (#1951)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:58:01 -08:00
renovate[bot]
37f634ac80
Update dependency tzlocal to v5.3 (#1972)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:57:21 -08:00
Jrnl Bot
d1e3e546f2 Update changelog [ci skip] 2025-02-25 04:57:00 +00:00
renovate[bot]
f8d80b2877
Update dependency jinja2 to v3.1.5 (#1966)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:55:10 -08:00
Jrnl Bot
8589b2ed65 Update changelog [ci skip] 2025-02-25 04:52:30 +00:00
renovate[bot]
6645b1e36f
Update dependency ruamel.yaml to v0.18.10 (#1967)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:51:02 -08:00
Jrnl Bot
316b9761d5 Update changelog [ci skip] 2025-02-25 04:49:07 +00:00
Jonathan Wren
e2a62e99a0
Update dependency pytest to >=8.1.1 (#1974)
* update pytest in deps

* update lock file

* update lock file
2025-02-24 20:47:32 -08:00
Jrnl Bot
692d0cb132 Update changelog [ci skip] 2025-02-25 04:39:11 +00:00
renovate[bot]
573e34fb48
Update dependency tox to v4.24.1 (#1945)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:36:33 -08:00
renovate[bot]
f2bb5eb501
Update dependency black to v25 (#1973)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:35:42 -08:00
Jrnl Bot
7ad6fca011 Update changelog [ci skip] 2025-02-25 04:32:45 +00:00
renovate[bot]
640150bcbe
Update dependency cryptography to v44 (#1962)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:30:38 -08:00
renovate[bot]
75c98a408c
Update dependency rich to v13.9.4 (#1946)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:30:03 -08:00
renovate[bot]
b8a8de98c3
Update dependency keyring to v25.6.0 (#1948)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:29:02 -08:00
Jrnl Bot
85eb730186 Update changelog [ci skip] 2025-02-25 04:28:43 +00:00
renovate[bot]
024ea00a95
Update dependency ruff to v0.9.7 (#1947)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:27:11 -08:00
Carl Smedstad
1530ad39a1
Update pytest-bdd to v8.0 (#1955)
* Encapsulate all multiline strings in triple-quotes in Gherkin files

Since pytest-bdd v8.0.0 uses the official Gherkin parser, multiline
strings must now be encapsulated by triple-quotes.

See:
- https://pytest-bdd.readthedocs.io/en/stable/#id2
- https://pytest-bdd.readthedocs.io/en/stable/#docstrings

* Remove comments in Gherkin files causing test breakage

These comments break the step matching.

* Fix compatibility of step-functions matching on multiple lines

In pytest-bdd v8.0.0 it is no longer possible to match based on multiple
lines, which breaks essentially all steps that support docstrings. Solve
this by adding a wrapper-function for each of these instances, that
matches the docstring step, and calls the original function.

So, what used to be:

    @then(parse("the output should match\n{regex}"))
    @then(parse('the output should match "{regex}"'))
    def output_should_match(regex, cli_run):
        ...

Is now:

    @then(parse("the output should match"))
    def output_should_match_docstring(cli_run, docstring):
        output_should_match(docstring, cli_run)

    @then(parse('the output should match "{regex}"'))
    def output_should_match(regex, cli_run):
        ...

There is possibly a way around this that is much better than what I've
done here, but this is a start at least.

* Update version requirement of pytest-bdd to >=8.0

* Update tox config to match poetry config

---------

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
2025-02-24 20:16:54 -08:00
Jrnl Bot
505a9b6846 Update changelog [ci skip] 2025-02-25 03:26:36 +00:00
David Sosa
30c341ef8b
fix typed.js URL (#1970) 2025-02-24 19:25:01 -08:00
Jrnl Bot
ccb64b1721 Update changelog [ci skip] 2025-02-25 03:15:37 +00:00
Jonathan Wren
a1b3a612a5
Remove deprecated command in Poetry >2.0 causing error in CI (#1971)
* remove deprecated flag from install command
* Change poetry install to poetry sync
* Change other poetry install to poetry sync

---------

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
2025-02-24 19:14:00 -08:00
Micah Jerome Ellison
247129c760
Fix 4.2 changelog by reverting to cleaned beta changelog (#1960) 2024-11-17 16:12:03 -08:00
Jrnl Bot
bb71dff815 Update changelog [ci skip] 2024-11-17 23:54:47 +00:00
Jrnl Bot
ba18bed4d7 Increment version to v4.2 2024-11-17 23:53:30 +00:00
Jrnl Bot
eb5fe6fef1 Update changelog [ci skip] 2024-10-19 22:06:23 +00:00
Jrnl Bot
16a0f043b1 Increment version to v4.2-beta 2024-10-19 22:04:52 +00:00
Micah Jerome Ellison
b760759906
Changelog cleanup (#1944)
* Sort packages and and remove extraneous entries

* Move docs accessibility issues to docs section
2024-10-19 14:54:41 -07:00
Jrnl Bot
2ce567e495 Update changelog [ci skip] 2024-10-19 21:30:10 +00:00
Micah Jerome Ellison
1143fba023
Force brighter color with XML syntax highlighting (#1943) 2024-10-19 14:28:21 -07:00
renovate[bot]
41279ae943
Update peter-evans/create-pull-request action to v7 (#1929)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:27:25 -07:00
Jrnl Bot
985187f866 Update changelog [ci skip] 2024-10-19 21:24:20 +00:00
renovate[bot]
53fef9021d
Update dependency typed.js to v2.1.0 (#1861)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:22:53 -07:00
Jrnl Bot
df4a5a5867 Update changelog [ci skip] 2024-10-19 21:20:37 +00:00
renovate[bot]
3f3bf3e77e
Update dependency xmltodict to v0.14.2 (#1940)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:19:03 -07:00
Jrnl Bot
1b79f0b340 Update changelog [ci skip] 2024-10-19 21:18:52 +00:00
renovate[bot]
428549778c
Update dependency parse-type to v0.6.4 (#1936)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:17:03 -07:00
Jrnl Bot
d9dae7af04 Update changelog [ci skip] 2024-10-19 21:15:48 +00:00
renovate[bot]
5f6be07fbd
Update dependency ruff to v0.7.0 (#1938)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:14:22 -07:00
renovate[bot]
a94f7c6161
Update dependency rich to v13.9.2 (#1937)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:13:55 -07:00
Jrnl Bot
086c34a6a7 Update changelog [ci skip] 2024-10-19 21:08:27 +00:00
renovate[bot]
0044b2dee8
Update dependency tox to v4.23.0 (#1935)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:06:09 -07:00
renovate[bot]
0cc4acd494
Update dependency black to v24.10.0 (#1939)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:05:26 -07:00
renovate[bot]
0d5bf1e467
Update dependency cryptography to v43.0.3 (#1942)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-19 14:05:04 -07:00
Jrnl Bot
85a98afcd9 Update changelog [ci skip] 2024-10-02 03:30:57 +00:00
Micah Jerome Ellison
96d89ca9d5
Add Python 3.13 support (#1930)
* Allow Python 3.13 in pyproject

* Add Python 3.13 to GitHub actions

* Run `poetry update`

* fix failing test

* update poetry.lock

* update poetry.lock again

---------

Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>
2024-10-01 20:29:06 -07:00
Jonathan Wren
de79733957
Add config to pa11y to workaround github actions issue (#1933)
fixes #1932
2024-10-01 20:28:11 -07:00
Jrnl Bot
af1b9f128e Update changelog [ci skip] 2024-10-02 02:17:11 +00:00
renovate[bot]
5145190584
Update dependency tox to v4.21.0 (#1927)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 19:15:05 -07:00
renovate[bot]
314576ae13
Update dependency rich to v13.9.1 (#1931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 19:14:38 -07:00
renovate[bot]
87c022780d
Update dependency cryptography to v43 (#1928)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 19:14:14 -07:00
Aaron Lichtman
a8bd0bcd44
Add calendar heatmap display format (#1759)
* Add calendar heatmap exporter

Fix #743

* Lint fixes

* More lint fixes

* Surface total number of entries per month in heatmap

* Refactoring

* More refactoring

* Resolve last lint error

* Unbump version

* Add calendar export test scaffolding

* WIP: Test debugging + scaffolding

* Remove broken tests

* Remove args from .vscode/launch.json

* Discard changes to tests/bdd/features/format.feature

* Remove extraneous vscode files

* move NestedDict to utils file

* run formatter

* fix import error

* Address lints

---------

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>
2024-10-01 18:59:26 -07:00
Jrnl Bot
2f0c5d2eb9 Update changelog [ci skip] 2024-10-01 01:25:58 +00:00
renovate[bot]
ae32ca6917
Update dependency rich to v13.8.1 (#1926)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:24:00 -07:00
renovate[bot]
5856517b0f
Update dependency poethepoet to v0.29.0 (#1925)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:23:21 -07:00
renovate[bot]
1586cc2b49
Update dependency pytest-xdist to v3.6.1 (#1897)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:22:27 -07:00
renovate[bot]
bcf41ddd17
Update dependency parse-type to v0.6.3 (#1922)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:21:23 -07:00
renovate[bot]
4017c4acb5
Update dependency keyring to v25.4.1 (#1924)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:20:46 -07:00
renovate[bot]
a646801c15
Update dependency black to v24.8.0 (#1923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:19:54 -07:00
renovate[bot]
cb504c4bfb
Update dependency pytest-bdd to v7.3.0 (#1896)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:19:06 -07:00
Jrnl Bot
21e4552360 Update changelog [ci skip] 2024-10-01 01:18:27 +00:00
renovate[bot]
cdb9a220bd
Update dependency python-dateutil to v2.9.0 (#1898)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:16:48 -07:00
renovate[bot]
2d3809e6f7
Update dependency jinja2 to v3.1.4 (#1892)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:15:58 -07:00
renovate[bot]
0ff69bd24c
Update dependency mkdocs to v1.6.1 (#1895)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:15:15 -07:00
renovate[bot]
dec4855816
Update dependency requests to v2.32.3 (#1899)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:14:37 -07:00
renovate[bot]
89eaf3440a
Update dependency cryptography to v42.0.8 (#1904)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 18:13:58 -07:00
Jrnl Bot
7953309c78 Update changelog [ci skip] 2024-10-01 01:12:25 +00:00
renovate[bot]
17e1ba60e5
Update dependency ruff to v0.6.8 (#1900)
* Update dependency ruff to v0.6.8

* Run `ruff check .` instead of `ruff .` due to ruff error

* Preface ruff lint keys with .lint to address ruff deprecation warning

* Changes to appease ruff linter

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
2024-09-30 18:10:49 -07:00
Jrnl Bot
4d84c491f1 Update changelog [ci skip] 2024-06-14 02:36:04 +00:00
Micah Jerome Ellison
79cf67eca6
Recommend pipx as easiest installation method for all OSes and remove warning about apt (#1889)
* Remove warning against installing pipx through apt (1886)
* Remove brew recommendation and consolidate pipx instructions (1888)
2024-06-13 19:34:31 -07:00
Jrnl Bot
c8c49b1ba2 Update changelog [ci skip] 2024-05-22 14:36:04 +00:00
renovate[bot]
8f2cb9c355
Update dependency poethepoet to v0.26.1 (#1862)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 07:34:33 -07:00
Jrnl Bot
9ac27704fb Update changelog [ci skip] 2024-05-22 14:32:05 +00:00
renovate[bot]
97b39dfd76
Update dependency tox to v4.15.0 (#1860)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 07:30:06 -07:00
Jrnl Bot
8fc158e35b Update changelog [ci skip] 2024-05-22 14:04:55 +00:00
renovate[bot]
83d4878044
Update dependency rich to v13.7.1 (#1864)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 07:03:04 -07:00
renovate[bot]
c9c71b40ef
Update dependency ruff to v0.4.4 (#1854)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 07:02:38 -07:00
Jrnl Bot
8cd4ac24a8 Update changelog [ci skip] 2024-05-22 14:00:33 +00:00
renovate[bot]
ca6b4a08a7
Update dependency cryptography to v42.0.7 (#1857)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 06:58:50 -07:00
Jrnl Bot
be9dbf52e0 Update changelog [ci skip] 2024-05-22 13:58:32 +00:00
renovate[bot]
4c4e36a534
Update dependency ruamel.yaml to v0.18.6 (#1855)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 06:55:55 -07:00
Jrnl Bot
7c4e3ad76e Update changelog [ci skip] 2024-05-22 13:55:04 +00:00
renovate[bot]
0c2c40d494
Update dependency keyring to v24.3.1 (#1863)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-22 06:53:26 -07:00
Jrnl Bot
ecf5f07dbb Update changelog [ci skip] 2024-05-21 04:18:03 +00:00
Ricardo Ruiz
8957ceb74d
Fix -contains to allow multiple terms with "OR" logic unless -and is added (#1890)
* Store multiple -contains arguments (OR default).

Allow multiple occurrences of the -contains argument
to be stored in a list. Previously, only the last occurrence was
considered. Additionally, the behavior has been modified to default to
OR logic, meaning that if multiple -contains arguments are provided,
entries matching any of them will be included in the results.

* Solved issue #1877 "-and" flag with multiple instances of the -contains option.

* Run poe format

* Fix unit test for contains to allow list instead of single value

* Add BDD tests for multiple contains with and without -and

* Black version updated.

* Revert pyproject.toml to appease poetry

---------

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
2024-05-20 21:16:33 -07:00
Jrnl Bot
0deadc03c8 Update changelog [ci skip] 2024-05-20 15:08:46 +00:00
renovate[bot]
d5a5401db9
Update dependency black to v24.4.2 (#1856)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-20 08:07:06 -07:00
Manu Ebert
0aefdb3f21
Begrudgingly, change Twitter references to X (#1884)
Small fix: Change the twitter icon on the Docs landing page to X, and change the verbiage accordingly
2024-04-23 18:27:39 -07:00
Jrnl Bot
9ad1c9f26b Update changelog [ci skip] 2024-03-28 15:10:04 +00:00
Ben Beasley
48b61f6953
Support pytest_bdd 7.1.2 and later (#1878)
* Support pytest_bdd 7.1.2 and later

Fix #1875.

* Prevent use of pytest 8.1 for now due to unrelated error

* poetry lock --no-update

---------

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
2024-03-28 08:08:00 -07:00
Jrnl Bot
2af05e4008 Update changelog [ci skip] 2024-02-02 04:07:22 +00:00
renovate[bot]
a13abe446b
Update dependency black to v24 (#1849)
* Update dependency black to v24

* update file to match new formatting from black

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>
2024-02-01 20:05:39 -08:00
renovate[bot]
5ce9d47126
Update dependency poethepoet to v0.24.4 (#1825)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 20:05:03 -08:00
Jrnl Bot
581af57bfd Update changelog [ci skip] 2024-02-02 03:49:26 +00:00
renovate[bot]
60abba3bfe
Update dependency ruamel.yaml to v0.18.5 (#1822)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:47:52 -08:00
Jrnl Bot
5323ca64fa Update changelog [ci skip] 2024-02-02 03:47:22 +00:00
renovate[bot]
1b2fa594e8
Update dependency ruff to v0.2.0 (#1824)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:45:51 -08:00
Jrnl Bot
36677fdccd Update changelog [ci skip] 2024-02-02 03:45:21 +00:00
renovate[bot]
896be7fb5f
Update dependency pytest-xdist to v3.5.0 (#1829)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:43:59 -08:00
Jrnl Bot
a2a6618959 Update changelog [ci skip] 2024-02-02 03:43:47 +00:00
renovate[bot]
39291bf1ce
Update dependency keyring to v24.3.0 (#1830)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:42:19 -08:00
Jrnl Bot
fbd468e03e Update changelog [ci skip] 2024-02-02 03:42:04 +00:00
renovate[bot]
d91c857fdc
Update dependency cryptography to v42 (#1850)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:40:28 -08:00
renovate[bot]
8eb124b54c
Update peter-evans/create-pull-request action to v6 (#1852)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:40:02 -08:00
Jrnl Bot
f3624a3fa2 Update changelog [ci skip] 2024-02-02 03:38:48 +00:00
renovate[bot]
de4cf5219e
Update nick-invision/retry action to v3 (#1851)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:37:06 -08:00
renovate[bot]
7fdc43b69d
Update dependency pa11y-ci to v3.1.0 (#1831)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:36:08 -08:00
renovate[bot]
df37641fa8
Update actions/setup-python action to v5 (#1848)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:35:05 -08:00
renovate[bot]
8edc14cfe7
Update actions/cache action to v4 (#1847)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:33:29 -08:00
renovate[bot]
8f2ac67659
Update dependency rich to v13.7.0 (#1833)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:32:36 -08:00
renovate[bot]
c5ba4cb198
Update dependency pytest-bdd to v7.0.1 (#1846)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:31:06 -08:00
renovate[bot]
d44515f764
Update dependency pytest to v7.4.4 (#1845)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:30:13 -08:00
Jrnl Bot
ccd68f1e78 Update changelog [ci skip] 2024-02-02 03:23:58 +00:00
renovate[bot]
fc16c6c3e8
Update dependency cryptography to v41.0.7 (#1837)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:22:31 -08:00
Jrnl Bot
b4e8bb0e12 Update changelog [ci skip] 2024-02-02 03:16:52 +00:00
renovate[bot]
5ca5ee6723
Update dependency jinja2 to v3.1.3 (#1844)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:15:11 -08:00
Jrnl Bot
ce50158167 Update changelog [ci skip] 2024-02-02 03:05:47 +00:00
renovate[bot]
d5f7182cf4
Update dependency tox to v4.12.1 (#1838)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 19:04:01 -08:00
Jrnl Bot
9d97df04a7 Update changelog [ci skip] 2024-02-02 02:54:59 +00:00
Micah Jerome Ellison
bf32d59844
Update release process to use Python 3.12 (#1820) 2024-02-01 18:53:27 -08:00
Jrnl Bot
caf3cdea3d Update changelog [ci skip] 2023-11-27 02:14:16 +00:00
utopiatopia
434c32003f
Document security risks of eavesdropping (#1834)
* Add security risks of eavesdropping
* Remove "Limitations" heading and dedent subheadings
* Move Plausible Deniability/Spying/Saved Passwords up above the long Shell History section

---------

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
2023-11-26 18:12:26 -08:00
Micah Jerome Ellison
48a31e8154
v4.1 changelog cleanup (#1826)
* Sort packaging deps alphabetically

* De-dupe packaging deps. Only the latest one matters for the changelog

* Add missing PRs and a special thanks note

* Add missing linebreak
2023-11-04 12:58:52 -07:00
Jrnl Bot
3fe3eda27b Update changelog [ci skip] 2023-11-04 19:37:42 +00:00
50 changed files with 1796 additions and 1069 deletions

View file

@ -11,7 +11,7 @@ runs:
shell: bash
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
@ -21,7 +21,7 @@ runs:
shell: bash
- name: poetry cache # Change CACHE_STRING secret to bust the cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: .venv
key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ env.PYTHON_FULL_VERSION }}-${{ inputs.cache-string }}
@ -34,7 +34,7 @@ runs:
echo '::endgroup::'
echo '::group::Other dependencies'
poetry install --remove-untracked
poetry sync
echo '::endgroup::'
echo 'DEPS_INSTALLED=true' >> $GITHUB_ENV

View file

@ -39,7 +39,7 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
@ -50,13 +50,13 @@ jobs:
run: echo "PYTHON_FULL_VERSION=$(python --version)" >> "$GITHUB_ENV"
- name: poetry cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: .venv
key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ env.PYTHON_FULL_VERSION }}-${{ secrets.CACHE_STRING }}
- name: npm cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-pa11y-v3
@ -65,7 +65,7 @@ jobs:
run: |
pip install poetry
poetry config --local virtualenvs.in-project true
poetry install --no-root --remove-untracked
poetry sync --no-root
npm install
echo "node_modules/.bin" >> "$GITHUB_PATH"

View file

@ -19,11 +19,6 @@ on:
type: boolean
required: true
default: true
include_brew:
description: 'Publish to Homebrew?'
type: boolean
required: true
default: true
jobs:
validate:
@ -66,9 +61,9 @@ jobs:
echo "JRNL_VERSION=$JRNL_VERSION" >> "$GITHUB_ENV"
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.13'
- name: Checkout repo
uses: actions/checkout@v4
@ -112,111 +107,3 @@ jobs:
run: |
pypi_version="$(find dist/jrnl-*.tar.gz | sed -r 's!dist/jrnl-(.*)\.tar\.gz!\1!')"
echo "pypi_version=$pypi_version" >> "$GITHUB_OUTPUT"
release_homebrew:
if: ${{ github.event.inputs.include_brew == 'true' }}
needs: release_pypi
name: "Release to Homebrew"
runs-on: macos-latest
env:
HOMEBREW_NO_AUTO_UPDATE: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
HOME_REPO: ${{ secrets.HOME_REPO }}
steps:
- name: Get version
run: |
JRNL_VERSION="${{ github.event.inputs.version }}"
PYPI_VERSION="${{ needs.release_pypi.outputs.pypi_version }}"
echo "::debug::jrnl version: $JRNL_VERSION"
echo "::debug::pypi version: $PYPI_VERSION"
echo "JRNL_VERSION=$JRNL_VERSION" >> "$GITHUB_ENV"
echo "PYPI_VERSION=$PYPI_VERSION" >> "$GITHUB_ENV"
- name: Set env variables
env:
REPO_OWNER: ${{ github.repository_owner }}
run: |
if [[ $JRNL_VERSION =~ (alpha|beta) ]]; then
echo '::debug::Prerelease (not a full release)'
{
echo "RELEASE_TYPE=pre"
echo "FORMULA_REPO=${REPO_OWNER}/homebrew-prerelease"
echo "BOT_REPO=jrnl-bot/homebrew-prerelease"
echo "FORMULA_NAME=jrnl-beta"
} >> "$GITHUB_ENV"
else
echo '::debug::Full release (not a prerelease)'
if [[ "${{ github.repository }}" == "${HOME_REPO}" ]]; then
REPO_OWNER="homebrew"
fi
{
echo "RELEASE_TYPE=full"
echo "FORMULA_REPO=${REPO_OWNER}/homebrew-core"
echo "BOT_REPO=jrnl-bot/homebrew-core"
echo "FORMULA_NAME=jrnl"
} >> "$GITHUB_ENV"
fi
- name: Tap formula
run: |
brew tap "${FORMULA_REPO}"
echo '::debug::Set tap directory'
echo "BREW_TAP_DIRECTORY=$(brew --repo "${FORMULA_REPO}")" >> "$GITHUB_ENV"
- name: Install dependencies
run: brew install pipgrip
- name: Query PyPI API
uses: nick-invision/retry@v2
with:
timeout_seconds: 10
max_attempts: 30
retry_wait_seconds: 10
command: |
curl -Ls https://pypi.org/pypi/jrnl/json > api_response.json
# if query doesn't have our version yet, give it some time before trying again
if [[ "null" == "$(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)" ]]; then
echo "::debug::PYPI_VERSION: $PYPI_VERSION"
echo "::debug::JQ VALUE: $(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)"
echo "::group::cat api_response.json"
cat api_response.json
echo "::endgroup::"
exit 1
fi
- name: Update Homebrew Formula
uses: nick-invision/retry@v2
with:
timeout_minutes: 8
max_attempts: 6
retry_wait_seconds: 30
command: >
brew bump-formula-pr "${FORMULA_NAME}"
--url $(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)
--sha256 $(jq ".releases[\"${PYPI_VERSION}\"][1].digests.sha256" -r api_response.json)
--no-audit
--write-only
--force
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
path: ${{ env.BREW_TAP_DIRECTORY }}
token: ${{ secrets.JRNL_BOT_TOKEN }}
push-to-fork: ${{ env.BOT_REPO }}
committer: ${{ secrets.JRNL_BOT_NAME }} <${{ secrets.JRNL_BOT_EMAIL }}>
author: ${{ secrets.JRNL_BOT_NAME }} <${{ secrets.JRNL_BOT_EMAIL }}>
title: jrnl ${{ env.JRNL_VERSION }}
body: Created with `brew bump-formula-pr`
branch: jrnl-${{ env.JRNL_VERSION }}--
branch-suffix: random
commit-message: |
jrnl ${{ env.JRNL_VERSION }}
Update jrnl to ${{ env.JRNL_VERSION }}
${{ secrets.RELEASE_COAUTHORS }}

View file

@ -37,7 +37,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [ '3.10', '3.11', '3.12' ]
python-version: [ '3.10', '3.11', '3.12', '3.13' ]
os: [ ubuntu-latest, macos-latest, windows-latest ]
steps:
- run: git config --global core.autocrlf false

View file

@ -17,7 +17,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [ '3.10', '3.11', '3.12' ]
python-version: [ '3.10', '3.11', '3.12', '3.13' ]
os: [ ubuntu-latest, macos-latest, windows-latest ]
steps:
- run: git config --global core.autocrlf false

View file

@ -1,24 +1,112 @@
# Changelog
## [v4.1-beta2](https://pypi.org/project/jrnl/v4.1-beta2/) (2023-10-31)
## [Unreleased](https://github.com/jrnl-org/jrnl/)
[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.1-beta...v4.1-beta2)
[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.2.1...HEAD)
**Fixed bugs:**
- Update from `4.0.1\_4` to `4.0.1\_5` broke something with colors [\#1819](https://github.com/jrnl-org/jrnl/issues/1819)
## [v4.1-beta](https://pypi.org/project/jrnl/v4.1-beta/) (2023-10-29)
[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.0.1...v4.1-beta)
**Implemented enhancements:**
- Add Python 3.12 support [\#1750](https://github.com/jrnl-org/jrnl/issues/1750)
- poetry warning - "poetry.dev-dependencies" section is deprecated [\#1975](https://github.com/jrnl-org/jrnl/issues/1975)
- Homebrew autobump error on jrnl release [\#1961](https://github.com/jrnl-org/jrnl/issues/1961)
**Build:**
- Linting rules aren't enforced the same as format rules [\#1742](https://github.com/jrnl-org/jrnl/issues/1742)
- Remove release step to publish to Homebrew [\#1994](https://github.com/jrnl-org/jrnl/pull/1994) ([micahellison](https://github.com/micahellison))
**Packaging:**
- Update dependency rich to v14 [\#1989](https://github.com/jrnl-org/jrnl/pull/1989) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency python to 3.13 [\#1988](https://github.com/jrnl-org/jrnl/pull/1988) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.25.0 [\#1986](https://github.com/jrnl-org/jrnl/pull/1986) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tzlocal to v5.3.1 [\#1984](https://github.com/jrnl-org/jrnl/pull/1984) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency jinja2 to v3.1.6 [\#1983](https://github.com/jrnl-org/jrnl/pull/1983) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.33.1 [\#1982](https://github.com/jrnl-org/jrnl/pull/1982) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest to v8.3.5 [\#1981](https://github.com/jrnl-org/jrnl/pull/1981) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v44.0.2 [\#1980](https://github.com/jrnl-org/jrnl/pull/1980) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.11.3 [\#1978](https://github.com/jrnl-org/jrnl/pull/1978) ([renovate[bot]](https://github.com/apps/renovate))
## [v4.2.1](https://pypi.org/project/jrnl/v4.2.1/) (2025-02-25)
[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.2...v4.2.1)
**Documentation:**
- Typing animation in landing page is broken [\#1969](https://github.com/jrnl-org/jrnl/issues/1969)
**Packaging:**
- Update dependency pytest to \>=8.1.1 [\#1974](https://github.com/jrnl-org/jrnl/pull/1974) ([wren](https://github.com/wren))
- Update dependency black to v25 [\#1973](https://github.com/jrnl-org/jrnl/pull/1973) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tzlocal to v5.3 [\#1972](https://github.com/jrnl-org/jrnl/pull/1972) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruamel.yaml to v0.18.10 [\#1967](https://github.com/jrnl-org/jrnl/pull/1967) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency jinja2 to v3.1.5 [\#1966](https://github.com/jrnl-org/jrnl/pull/1966) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v44 [\#1962](https://github.com/jrnl-org/jrnl/pull/1962) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest-bdd to v8.1.0 [\#1952](https://github.com/jrnl-org/jrnl/pull/1952) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.32.2 [\#1951](https://github.com/jrnl-org/jrnl/pull/1951) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency keyring to v25.6.0 [\#1948](https://github.com/jrnl-org/jrnl/pull/1948) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.9.7 [\#1947](https://github.com/jrnl-org/jrnl/pull/1947) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.9.4 [\#1946](https://github.com/jrnl-org/jrnl/pull/1946) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.24.1 [\#1945](https://github.com/jrnl-org/jrnl/pull/1945) ([renovate[bot]](https://github.com/apps/renovate))
## [v4.2](https://pypi.org/project/jrnl/v4.2/) (2024-11-17)
[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.2-beta...v4.2)
**Implemented enhancements:**
- Add Python 3.13 support [\#1893](https://github.com/jrnl-org/jrnl/issues/1893)
- Add calendar heatmap display format [\#1759](https://github.com/jrnl-org/jrnl/pull/1759) ([alichtman](https://github.com/alichtman))
**Fixed bugs:**
- -contains doesn't accept multiple search terms, doesn't work with -and [\#1877](https://github.com/jrnl-org/jrnl/issues/1877)
- Tests failing on develop branch starting with pytest-bdd 7.1.2 [\#1875](https://github.com/jrnl-org/jrnl/issues/1875)
- Ignore color when used in a pipeline [\#1839](https://github.com/jrnl-org/jrnl/issues/1839)
- Fix -contains to allow multiple terms with "OR" logic unless -and is added [\#1890](https://github.com/jrnl-org/jrnl/pull/1890) ([eigenric](https://github.com/eigenric))
**Documentation:**
- Recommend pipx as default installation method [\#1888](https://github.com/jrnl-org/jrnl/issues/1888)
- Remove documentation recommendation to install pipx through brew or pip [\#1886](https://github.com/jrnl-org/jrnl/issues/1886)
- Document security risks of using a computer that someone else has admin access to [\#1793](https://github.com/jrnl-org/jrnl/issues/1793)
- Recommend pipx as easiest installation method for all OSes and remove warning about apt [\#1889](https://github.com/jrnl-org/jrnl/pull/1889) ([micahellison](https://github.com/micahellison))
- Docs accessibility checker failure - contrast ratio [\#1934](https://github.com/jrnl-org/jrnl/issues/1934)
- Docs accessibility test runner failing [\#1932](https://github.com/jrnl-org/jrnl/issues/1932)
**Packaging:**
- Update actions/cache action to v4 [\#1847](https://github.com/jrnl-org/jrnl/pull/1847) ([renovate[bot]](https://github.com/apps/renovate))
- Update actions/setup-python action to v5 [\#1848](https://github.com/jrnl-org/jrnl/pull/1848) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency black to v24.8.0 [\#1923](https://github.com/jrnl-org/jrnl/pull/1923) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v43.0.3 [\#1942](https://github.com/jrnl-org/jrnl/pull/1942) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency jinja2 to v3.1.4 [\#1892](https://github.com/jrnl-org/jrnl/pull/1892) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency keyring to v25.4.1 [\#1924](https://github.com/jrnl-org/jrnl/pull/1924) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency mkdocs to v1.6.1 [\#1895](https://github.com/jrnl-org/jrnl/pull/1895) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pa11y-ci to v3.1.0 [\#1831](https://github.com/jrnl-org/jrnl/pull/1831) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency parse-type to v0.6.4 [\#1936](https://github.com/jrnl-org/jrnl/pull/1936) ([renovate[bot]](https://github.com/apps/renovate))
- Update peter-evans/create-pull-request action to v7 [\#1929](https://github.com/jrnl-org/jrnl/pull/1929) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.29.0 [\#1925](https://github.com/jrnl-org/jrnl/pull/1925) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest to v7.4.4 [\#1845](https://github.com/jrnl-org/jrnl/pull/1845) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest-bdd to v7.3.0 [\#1896](https://github.com/jrnl-org/jrnl/pull/1896) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest-xdist to v3.6.1 [\#1897](https://github.com/jrnl-org/jrnl/pull/1897) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency python-dateutil to v2.9.0 [\#1898](https://github.com/jrnl-org/jrnl/pull/1898) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency requests to v2.32.3 [\#1899](https://github.com/jrnl-org/jrnl/pull/1899) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.9.2 [\#1937](https://github.com/jrnl-org/jrnl/pull/1937) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruamel.yaml to v0.18.6 [\#1855](https://github.com/jrnl-org/jrnl/pull/1855) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.7.0 [\#1938](https://github.com/jrnl-org/jrnl/pull/1938) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.23.0 [\#1935](https://github.com/jrnl-org/jrnl/pull/1935) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency typed.js to v2.1.0 [\#1861](https://github.com/jrnl-org/jrnl/pull/1861) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency xmltodict to v0.14.2 [\#1940](https://github.com/jrnl-org/jrnl/pull/1940) ([renovate[bot]](https://github.com/apps/renovate))
- Update nick-invision/retry action to v3 [\#1851](https://github.com/jrnl-org/jrnl/pull/1851) ([renovate[bot]](https://github.com/apps/renovate))
- Update peter-evans/create-pull-request action to v6 [\#1852](https://github.com/jrnl-org/jrnl/pull/1852) ([renovate[bot]](https://github.com/apps/renovate))
## [v4.1](https://pypi.org/project/jrnl/v4.1/) (2023-11-04)
[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.1-beta2...v4.1)
**Build:**
- Add Python 3.12 support [\#1761](https://github.com/jrnl-org/jrnl/pull/1761) ([micahellison](https://github.com/micahellison))
- Set new required build fields in the ReadTheDocs config file [\#1803](https://github.com/jrnl-org/jrnl/pull/1803) ([micahellison](https://github.com/micahellison))
- Replace flake8 and isort with ruff linter and add `black --check` to linting step [\#1763](https://github.com/jrnl-org/jrnl/pull/1763) ([micahellison](https://github.com/micahellison))
@ -28,47 +116,25 @@
**Packaging:**
- Update dependency pytest to v7.4.3 [\#1816](https://github.com/jrnl-org/jrnl/pull/1816) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v41.0.5 [\#1815](https://github.com/jrnl-org/jrnl/pull/1815) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tzlocal to v5.2 [\#1814](https://github.com/jrnl-org/jrnl/pull/1814) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruamel.yaml to v0.18.3 [\#1813](https://github.com/jrnl-org/jrnl/pull/1813) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency black to v23.10.1 [\#1811](https://github.com/jrnl-org/jrnl/pull/1811) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.1.3 [\#1810](https://github.com/jrnl-org/jrnl/pull/1810) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest-bdd to v7 [\#1807](https://github.com/jrnl-org/jrnl/pull/1807) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.24.1 [\#1806](https://github.com/jrnl-org/jrnl/pull/1806) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tzlocal to v5.1 [\#1804](https://github.com/jrnl-org/jrnl/pull/1804) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruamel.yaml to v0.17.35 [\#1802](https://github.com/jrnl-org/jrnl/pull/1802) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.24.0 [\#1798](https://github.com/jrnl-org/jrnl/pull/1798) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.0.292 [\#1797](https://github.com/jrnl-org/jrnl/pull/1797) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v41.0.4 [\#1796](https://github.com/jrnl-org/jrnl/pull/1796) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency mkdocs to v1.5.3 [\#1795](https://github.com/jrnl-org/jrnl/pull/1795) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.6.0 [\#1794](https://github.com/jrnl-org/jrnl/pull/1794) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.0.290 [\#1792](https://github.com/jrnl-org/jrnl/pull/1792) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency black to v23.9.1 [\#1791](https://github.com/jrnl-org/jrnl/pull/1791) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency black to v23.9.0 [\#1790](https://github.com/jrnl-org/jrnl/pull/1790) ([renovate[bot]](https://github.com/apps/renovate))
- Drop/replace ansiwrap dependency [\#1191](https://github.com/jrnl-org/jrnl/issues/1191)
- Use rich instead of ansiwrap to wrap text [\#1693](https://github.com/jrnl-org/jrnl/pull/1693) ([micahellison](https://github.com/micahellison))
- Update actions/checkout action to v4 [\#1788](https://github.com/jrnl-org/jrnl/pull/1788) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest to v7.4.2 [\#1787](https://github.com/jrnl-org/jrnl/pull/1787) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.22.1 [\#1785](https://github.com/jrnl-org/jrnl/pull/1785) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.11.3 [\#1782](https://github.com/jrnl-org/jrnl/pull/1782) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency mkdocs to v1.5.2 [\#1780](https://github.com/jrnl-org/jrnl/pull/1780) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v41.0.3 [\#1779](https://github.com/jrnl-org/jrnl/pull/1779) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.0.287 [\#1778](https://github.com/jrnl-org/jrnl/pull/1778) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.5.2 [\#1776](https://github.com/jrnl-org/jrnl/pull/1776) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.5.0 [\#1775](https://github.com/jrnl-org/jrnl/pull/1775) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency mkdocs to v1.5.1 [\#1774](https://github.com/jrnl-org/jrnl/pull/1774) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.0.280 [\#1773](https://github.com/jrnl-org/jrnl/pull/1773) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v41.0.2 [\#1770](https://github.com/jrnl-org/jrnl/pull/1770) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency black to v23.7.0 [\#1769](https://github.com/jrnl-org/jrnl/pull/1769) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.21.1 [\#1767](https://github.com/jrnl-org/jrnl/pull/1767) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.6.4 [\#1765](https://github.com/jrnl-org/jrnl/pull/1765) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency parse-type to v0.6.2 [\#1762](https://github.com/jrnl-org/jrnl/pull/1762) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency black to v23.10.1 [\#1811](https://github.com/jrnl-org/jrnl/pull/1811) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v41.0.5 [\#1815](https://github.com/jrnl-org/jrnl/pull/1815) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency keyring to v24.2.0 [\#1760](https://github.com/jrnl-org/jrnl/pull/1760) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency keyring to v24 [\#1758](https://github.com/jrnl-org/jrnl/pull/1758) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest to v7.4.0 [\#1757](https://github.com/jrnl-org/jrnl/pull/1757) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.4.2 [\#1754](https://github.com/jrnl-org/jrnl/pull/1754) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency cryptography to v41 [\#1753](https://github.com/jrnl-org/jrnl/pull/1753) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruamel.yaml to v0.17.32 [\#1752](https://github.com/jrnl-org/jrnl/pull/1752) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.6.3 [\#1751](https://github.com/jrnl-org/jrnl/pull/1751) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency mkdocs to v1.5.3 [\#1795](https://github.com/jrnl-org/jrnl/pull/1795) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency parse-type to v0.6.2 [\#1762](https://github.com/jrnl-org/jrnl/pull/1762) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency poethepoet to v0.24.1 [\#1806](https://github.com/jrnl-org/jrnl/pull/1806) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest to v7.4.3 [\#1816](https://github.com/jrnl-org/jrnl/pull/1816) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency pytest-bdd to v7 [\#1807](https://github.com/jrnl-org/jrnl/pull/1807) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency rich to v13.6.0 [\#1794](https://github.com/jrnl-org/jrnl/pull/1794) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruamel.yaml to v0.18.3 [\#1813](https://github.com/jrnl-org/jrnl/pull/1813) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ruff to v0.1.3 [\#1810](https://github.com/jrnl-org/jrnl/pull/1810) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tox to v4.11.3 [\#1782](https://github.com/jrnl-org/jrnl/pull/1782) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency tzlocal to v5.2 [\#1814](https://github.com/jrnl-org/jrnl/pull/1814) ([renovate[bot]](https://github.com/apps/renovate))
**Special thanks:**
- jrnl uses UTC instead of local time for entries in WSL/Ubuntu [\#1607](https://github.com/jrnl-org/jrnl/issues/1607) investigated and reported upstream by [giuseppedandrea](https://github.com/giuseppedandrea)
## [v4.0.1](https://pypi.org/project/jrnl/v4.0.1/) (2023-06-20)

View file

@ -7,24 +7,14 @@ License: https://www.gnu.org/licenses/gpl-3.0.html
## Installation
On Mac and Linux, the easiest way to install `jrnl` is using
[Homebrew](http://brew.sh/):
``` sh
brew install jrnl
```
On other platforms, install `jrnl` using [Python](https://www.python.org/) 3.10+ and [pipx](https://pipxproject.github.io/pipx/):
The easiest way to install `jrnl` is using
[pipx](https://pipx.pypa.io/stable/installation/)
with [Python](https://www.python.org/) 3.10+:
``` sh
pipx install jrnl
```
!!! note
`pipx` should be installed through either `brew` or `pip`. Missing dependencies and other issues
may occur when installing `pipx` through `apt` or another package manager. Further installation
instructions can be found in [pipx's documentation](https://pipxproject.github.io/pipx/installation/).
!!! tip
Do not use `sudo` while installing `jrnl`. This may lead to path issues.

View file

@ -14,6 +14,35 @@ program there are some limitations to be aware of.
passwords can be easily circumvented by someone with basic security skills
to access to your encrypted `jrnl` file.
## Plausible deniability
You may be able to hide the contents of your journal behind a layer of encryption,
but if someone has access to your configuration file, then they can figure out that
you have a journal, where that journal file is, and when you last edited it.
With a sufficient power imbalance, someone may be able to force you to unencrypt
it through non-technical means.
## Spying
While `jrnl` can protect against unauthorized access to your journal entries while
it isn't open, it cannot protect you against an unsafe computer/location.
For example:
- Someone installs a keylogger, tracking what you type into your journal.
- Someone watches your screen while you write your entry.
- Someone installs a backdoor into `jrnl` or poisons your journal into revealing your entries.
## Saved Passwords
When creating an encrypted journal, you'll be prompted as to whether or not you
want to "store the password in your keychain." This keychain is accessed using
the [Python keyring library](https://pypi.org/project/keyring/), which has different
behavior depending on your operating system.
In Windows, the keychain is the Windows Credential Manager (WCM), which can't be locked
and can be accessed by any other application running under your username. If this is
a concern for you, you may not want to store your password.
## Shell history
Since you can enter entries from the command line, any tool that logs command
@ -198,25 +227,6 @@ vim.api.nvim_create_autocmd( {"BufNewFile","BufReadPre" }, {
Please see `:h <option>` in Neovim for more information about the options mentioned.
## Plausible deniability
You may be able to hide the contents of your journal behind a layer of encryption,
but if someone has access to your configuration file, then they can figure out that
you have a journal, where that journal file is, and when you last edited it.
With a sufficient power imbalance, someone may be able to force you to unencrypt
it through non-technical means.
## Saved Passwords
When creating an encrypted journal, you'll be prompted as to whether or not you
want to "store the password in your keychain." This keychain is accessed using
the [Python keyring library](https://pypi.org/project/keyring/), which has different
behavior depending on your operating system.
In Windows, the keychain is the Windows Credential Manager (WCM), which can't be locked
and can be accessed by any other application running under your username. If this is
a concern for you, you may not want to store your password.
## Notice any other risks?
Please let the maintainers know by [filing an issue on GitHub](https://github.com/jrnl-org/jrnl/issues).

View file

@ -139,3 +139,9 @@ Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
.rst-content .tip .admonition {
background: var(--light-blue);
}
/* hack to bypass a11y issue with conflicting highlight.css files */
code.language-xml span.hljs-meta span.hljs-string {
color: var(--green) !important;
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -65,7 +65,7 @@ License: https://www.gnu.org/licenses/gpl-3.0.html
<a href="overview">Documentation</a>
<a href="installation" class="cta">Get Started</a>
<a href="http://github.com/jrnl-org/jrnl" title="View on Github">Fork on GitHub</a>
<a id="twitter-nav" href="https://twitter.com/intent/tweet?text=Collect+your+thoughts+and+notes+without+leaving+the+command+line.+https%3A%2F%2Fjrnl.sh+via+@JrnlSh"><i class="icon twitter"></i>Tell your friends on Twitter</a>
<a id="twitter-nav" href="https://twitter.com/intent/tweet?text=Collect+your+thoughts+and+notes+without+leaving+the+command+line.+https%3A%2F%2Fjrnl.sh+via+@JrnlSh">Tell your friends on X</a>
</nav>
<div class="flex">
<section>
@ -103,7 +103,7 @@ License: https://www.gnu.org/licenses/gpl-3.0.html
<footer>
jrnl is made with love by <a href="https://github.com/jrnl-org/jrnl/graphs/contributors" title="Contributors">many fabulous people</a>. If you need help, <a href="https://github.com/jrnl-org/jrnl/issues/new/choose" title="Open a new issue on Github">submit an issue</a> on Github.
</footer>
<script src="//cdnjs.cloudflare.com/ajax/libs/typed.js/2.0.12/typed.min.js"></script>
<script src="https://unpkg.com/typed.js@2.1.0/dist/typed.umd.js"></script>
<script>
new Typed("#typed", {
strings: [

View file

@ -1,2 +1,2 @@
mkdocs>=1.4
jinja2==3.1.2
jinja2==3.1.6

View file

@ -1 +1 @@
__version__ = "v4.1"
__version__ = "v4.2.1"

View file

@ -265,6 +265,7 @@ def parse_args(args: list[str] = []) -> argparse.Namespace:
reading.add_argument(
"-contains",
dest="contains",
action="append",
metavar="TEXT",
help="Show entries containing specific text (put quotes around text with "
"spaces)",

View file

@ -76,7 +76,17 @@ def postconfig_import(args: argparse.Namespace, config: dict, **_) -> int:
journal = open_journal(args.journal_name, config)
format = args.export if args.export else "jrnl"
get_importer(format).import_(journal, args.filename)
if (importer := get_importer(format)) is None:
raise JrnlException(
Message(
MsgText.ImporterNotFound,
MsgStyle.ERROR,
{"format": format},
)
)
importer.import_(journal, args.filename)
return 0

View file

@ -58,9 +58,9 @@ def get_text_from_stdin() -> str:
MsgText.WritingEntryStart,
MsgStyle.TITLE,
{
"how_to_quit": MsgText.HowToQuitWindows
if on_windows()
else MsgText.HowToQuitLinux
"how_to_quit": (
MsgText.HowToQuitWindows if on_windows() else MsgText.HowToQuitLinux
)
},
)
)

View file

@ -246,7 +246,7 @@ class Journal:
exclude_starred=False,
exclude_tagged=False,
strict=False,
contains=None,
contains=[],
exclude=[],
):
"""Removes all entries from the journal that don't match the filter.
@ -276,7 +276,7 @@ class Journal:
return 0 < len([tag for tag in tags if tag in excluded_tags])
if contains:
contains_lower = contains.casefold()
contains_lower = [substring.casefold() for substring in contains]
# Create datetime object for comparison below
# this approach allows various formats
@ -298,8 +298,20 @@ class Journal:
and (
not contains
or (
contains_lower in entry.title.casefold()
or contains_lower in entry.body.casefold()
strict
and all(
substring in entry.title.casefold()
or substring in entry.body.casefold()
for substring in contains_lower
)
)
or (
not strict
and any(
substring in entry.title.casefold()
or substring in entry.body.casefold()
for substring in contains_lower
)
)
)
]

View file

@ -266,6 +266,11 @@ class MsgText(Enum):
{count} imported to {journal_name} journal
"""
ImporterNotFound = """
No importer found for file type '{format}'.
'{format}' is likely to be an export-only format.
"""
# --- Color --- #
InvalidColor = "{key} set to invalid color: {color}"

View file

@ -3,6 +3,7 @@
from typing import Type
from jrnl.plugins.calendar_heatmap_exporter import CalendarHeatmapExporter
from jrnl.plugins.dates_exporter import DatesExporter
from jrnl.plugins.fancy_exporter import FancyExporter
from jrnl.plugins.jrnl_importer import JRNLImporter
@ -14,14 +15,15 @@ from jrnl.plugins.xml_exporter import XMLExporter
from jrnl.plugins.yaml_exporter import YAMLExporter
__exporters = [
CalendarHeatmapExporter,
DatesExporter,
FancyExporter,
JSONExporter,
MarkdownExporter,
TagExporter,
DatesExporter,
TextExporter,
XMLExporter,
YAMLExporter,
FancyExporter,
]
__importers = [JRNLImporter]

View file

@ -0,0 +1,117 @@
# Copyright © 2012-2023 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html
import calendar
from datetime import datetime
from typing import TYPE_CHECKING
from rich import box
from rich.align import Align
from rich.columns import Columns
from rich.console import Console
from rich.table import Table
from rich.text import Text
from jrnl.plugins.text_exporter import TextExporter
from jrnl.plugins.util import get_journal_frequency_nested
if TYPE_CHECKING:
from jrnl.journals import Entry
from jrnl.journals import Journal
from jrnl.plugins.util import NestedDict
class CalendarHeatmapExporter(TextExporter):
"""This Exporter displays a calendar heatmap of the journaling frequency."""
names = ["calendar", "heatmap"]
extension = "cal"
@classmethod
def export_entry(cls, entry: "Entry"):
raise NotImplementedError
@classmethod
def print_calendar_heatmap(cls, journal_frequency: "NestedDict") -> str:
"""Returns a string representation of the calendar heatmap."""
console = Console()
cal = calendar.Calendar()
curr_year = datetime.now().year
curr_month = datetime.now().month
curr_day = datetime.now().day
hit_first_entry = False
with console.capture() as capture:
for year, month_journaling_freq in journal_frequency.items():
year_calendar = []
for month in range(1, 13):
if month > curr_month and year == curr_year:
break
entries_this_month = sum(month_journaling_freq[month].values())
if not hit_first_entry and entries_this_month > 0:
hit_first_entry = True
if entries_this_month == 0 and not hit_first_entry:
continue
elif entries_this_month == 0:
entry_msg = "No entries"
elif entries_this_month == 1:
entry_msg = "1 entry"
else:
entry_msg = f"{entries_this_month} entries"
table = Table(
title=f"{calendar.month_name[month]} {year} ({entry_msg})",
title_style="bold green",
box=box.SIMPLE_HEAVY,
padding=0,
)
for week_day in cal.iterweekdays():
table.add_column(
"{:.3}".format(calendar.day_name[week_day]), justify="right"
)
month_days = cal.monthdayscalendar(year, month)
for weekdays in month_days:
days = []
for _, day in enumerate(weekdays):
if day == 0: # Not a part of this month, just filler.
day_label = Text(str(day or ""), style="white")
elif (
day > curr_day
and month == curr_month
and year == curr_year
):
break
else:
journal_frequency_for_day = (
month_journaling_freq[month][day] or 0
)
day = str(day)
# TODO: Make colors configurable?
if journal_frequency_for_day == 0:
day_label = Text(day, style="red on black")
elif journal_frequency_for_day == 1:
day_label = Text(day, style="black on yellow")
elif journal_frequency_for_day == 2:
day_label = Text(day, style="black on green")
else:
day_label = Text(day, style="black on white")
days.append(day_label)
table.add_row(*days)
year_calendar.append(Align.center(table))
# Print year header line
console.rule(str(year))
console.print()
# Print calendar
console.print(Columns(year_calendar, padding=1, expand=True))
return capture.get()
@classmethod
def export_journal(cls, journal: "Journal"):
"""Returns dates and their frequencies for an entire journal."""
journal_entry_date_frequency = get_journal_frequency_nested(journal)
return cls.print_calendar_heatmap(journal_entry_date_frequency)

View file

@ -1,10 +1,10 @@
# Copyright © 2012-2023 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html
from collections import Counter
from typing import TYPE_CHECKING
from jrnl.plugins.text_exporter import TextExporter
from jrnl.plugins.util import get_journal_frequency_one_level
if TYPE_CHECKING:
from jrnl.journals import Entry
@ -24,10 +24,6 @@ class DatesExporter(TextExporter):
@classmethod
def export_journal(cls, journal: "Journal") -> str:
"""Returns dates and their frequencies for an entire journal."""
date_counts = Counter()
for entry in journal.entries:
# entry.date.date() gets date without time
date = str(entry.date.date())
date_counts[date] += 1
date_counts = get_journal_frequency_one_level(journal)
result = "\n".join(f"{date}, {count}" for date, count in date_counts.items())
return result

View file

@ -1,12 +1,21 @@
# Copyright © 2012-2023 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html
from collections import Counter
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from jrnl.journals import Journal
class NestedDict(dict):
"""https://stackoverflow.com/a/74873621/8740440"""
def __missing__(self, x):
self[x] = NestedDict()
return self[x]
def get_tags_count(journal: "Journal") -> set[tuple[int, str]]:
"""Returns a set of tuples (count, tag) for all tags present in the journal."""
# Astute reader: should the following line leave you as puzzled as me the first time
@ -29,3 +38,26 @@ def oxford_list(lst: list) -> str:
return lst[0] + " or " + lst[1]
else:
return ", ".join(lst[:-1]) + ", or " + lst[-1]
def get_journal_frequency_nested(journal: "Journal") -> NestedDict:
"""Returns a NestedDict of the form {year: {month: {day: count}}}"""
journal_frequency = NestedDict()
for entry in journal.entries:
date = entry.date.date()
if date.day in journal_frequency[date.year][date.month]:
journal_frequency[date.year][date.month][date.day] += 1
else:
journal_frequency[date.year][date.month][date.day] = 1
return journal_frequency
def get_journal_frequency_one_level(journal: "Journal") -> Counter:
"""Returns a Counter of the form {date (YYYY-MM-DD): count}"""
date_counts = Counter()
for entry in journal.entries:
# entry.date.date() gets date without time
date = str(entry.date.date())
date_counts[date] += 1
return date_counts

150
package-lock.json generated
View file

@ -5,7 +5,7 @@
"packages": {
"": {
"devDependencies": {
"pa11y-ci": "3.0.1"
"pa11y-ci": "3.1.0"
}
},
"node_modules/@types/node": {
@ -25,12 +25,6 @@
"@types/node": "*"
}
},
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@ -74,9 +68,9 @@
}
},
"node_modules/axe-core": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz",
"integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==",
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.4.tgz",
"integrity": "sha512-9AiDKFKUCWEQm1Kj4lcq7KFavLqSXdf2m/zJo+NVh4VXlW5iwXRJ6alkKmipCyYorsRnqsICH9XLubP1jBF+Og==",
"dev": true,
"engines": {
"node": ">=4"
@ -525,19 +519,6 @@
"node": ">= 0.4.0"
}
},
"node_modules/hogan.js": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz",
"integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==",
"dev": true,
"dependencies": {
"mkdirp": "0.3.0",
"nopt": "1.0.10"
},
"bin": {
"hulk": "bin/hulk"
}
},
"node_modules/hoopy": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
@ -684,16 +665,6 @@
"node": "*"
}
},
"node_modules/mkdirp": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz",
"integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==",
"deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@ -706,6 +677,15 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"dev": true,
"bin": {
"mustache": "bin/mustache"
}
},
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@ -739,21 +719,6 @@
"node": ">=0.4.0"
}
},
"node_modules/nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"dev": true,
"dependencies": {
"abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
"node": "*"
}
},
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@ -830,18 +795,18 @@
}
},
"node_modules/pa11y": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/pa11y/-/pa11y-6.1.1.tgz",
"integrity": "sha512-2NzqA3D9CUlDWj8WuOI4fM2P0qM1d/IUxsRRpzCOfDT5eMR1oEgmUwW2TAk+f90ff/GVck0BewdYT4et4BANew==",
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/pa11y/-/pa11y-6.2.3.tgz",
"integrity": "sha512-69JoUlfW2QVmrgQAm+17XBxIvmd1u0ImFBYIHPyjC61CzAkmxO3kkbqDVxIcl0OKLvAMYSMbvfCH8kMFE9xsbg==",
"dev": true,
"dependencies": {
"axe-core": "^4.0.2",
"axe-core": "~4.2.1",
"bfj": "~7.0.2",
"commander": "~8.0.0",
"envinfo": "~7.8.1",
"hogan.js": "^3.0.2",
"html_codesniffer": "^2.5.1",
"html_codesniffer": "~2.5.1",
"kleur": "~4.1.4",
"mustache": "~4.2.0",
"node.extend": "~2.0.2",
"p-timeout": "~4.1.0",
"puppeteer": "~9.1.1",
@ -855,19 +820,19 @@
}
},
"node_modules/pa11y-ci": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pa11y-ci/-/pa11y-ci-3.0.1.tgz",
"integrity": "sha512-DUtEIhEG3Ofds7qRuplq0DdCb9doILRlzcRctFNzo4QUNmVy4iZfM3u51A9cqoPo2irCJZoo5BzfiFrcriY2IQ==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/pa11y-ci/-/pa11y-ci-3.1.0.tgz",
"integrity": "sha512-1WBGBMq0dYtZ+N/SH/AcnFSsT6sZ2w27d8Z/5XHJWSELeX8Qhh4yX5f0drb7crwjt7ugKSo4A7eEF9RbMB0LYg==",
"dev": true,
"dependencies": {
"async": "~2.6.3",
"async": "~2.6.4",
"cheerio": "~1.0.0-rc.10",
"commander": "~6.2.1",
"globby": "~6.1.0",
"kleur": "~4.1.4",
"lodash": "~4.17.21",
"node-fetch": "~2.6.1",
"pa11y": "~6.1.0",
"pa11y": "^6.2.3",
"protocolify": "~3.0.0",
"puppeteer": "~9.1.1",
"wordwrap": "~1.0.0"
@ -876,7 +841,7 @@
"pa11y-ci": "bin/pa11y-ci.js"
},
"engines": {
"node": ">=12"
"node": ">= 12"
}
},
"node_modules/pa11y/node_modules/commander": {
@ -1270,12 +1235,6 @@
"@types/node": "*"
}
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@ -1310,9 +1269,9 @@
}
},
"axe-core": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz",
"integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==",
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.4.tgz",
"integrity": "sha512-9AiDKFKUCWEQm1Kj4lcq7KFavLqSXdf2m/zJo+NVh4VXlW5iwXRJ6alkKmipCyYorsRnqsICH9XLubP1jBF+Og==",
"dev": true
},
"balanced-match": {
@ -1633,16 +1592,6 @@
"function-bind": "^1.1.1"
}
},
"hogan.js": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz",
"integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==",
"dev": true,
"requires": {
"mkdirp": "0.3.0",
"nopt": "1.0.10"
}
},
"hoopy": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
@ -1744,12 +1693,6 @@
"brace-expansion": "^1.1.7"
}
},
"mkdirp": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz",
"integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==",
"dev": true
},
"mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@ -1762,6 +1705,12 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"dev": true
},
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@ -1781,15 +1730,6 @@
"is": "^3.2.1"
}
},
"nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"dev": true,
"requires": {
"abbrev": "1"
}
},
"nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@ -1845,18 +1785,18 @@
"dev": true
},
"pa11y": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/pa11y/-/pa11y-6.1.1.tgz",
"integrity": "sha512-2NzqA3D9CUlDWj8WuOI4fM2P0qM1d/IUxsRRpzCOfDT5eMR1oEgmUwW2TAk+f90ff/GVck0BewdYT4et4BANew==",
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/pa11y/-/pa11y-6.2.3.tgz",
"integrity": "sha512-69JoUlfW2QVmrgQAm+17XBxIvmd1u0ImFBYIHPyjC61CzAkmxO3kkbqDVxIcl0OKLvAMYSMbvfCH8kMFE9xsbg==",
"dev": true,
"requires": {
"axe-core": "^4.0.2",
"axe-core": "~4.2.1",
"bfj": "~7.0.2",
"commander": "~8.0.0",
"envinfo": "~7.8.1",
"hogan.js": "^3.0.2",
"html_codesniffer": "^2.5.1",
"html_codesniffer": "~2.5.1",
"kleur": "~4.1.4",
"mustache": "~4.2.0",
"node.extend": "~2.0.2",
"p-timeout": "~4.1.0",
"puppeteer": "~9.1.1",
@ -1872,19 +1812,19 @@
}
},
"pa11y-ci": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/pa11y-ci/-/pa11y-ci-3.0.1.tgz",
"integrity": "sha512-DUtEIhEG3Ofds7qRuplq0DdCb9doILRlzcRctFNzo4QUNmVy4iZfM3u51A9cqoPo2irCJZoo5BzfiFrcriY2IQ==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/pa11y-ci/-/pa11y-ci-3.1.0.tgz",
"integrity": "sha512-1WBGBMq0dYtZ+N/SH/AcnFSsT6sZ2w27d8Z/5XHJWSELeX8Qhh4yX5f0drb7crwjt7ugKSo4A7eEF9RbMB0LYg==",
"dev": true,
"requires": {
"async": "~2.6.3",
"async": "~2.6.4",
"cheerio": "~1.0.0-rc.10",
"commander": "~6.2.1",
"globby": "~6.1.0",
"kleur": "~4.1.4",
"lodash": "~4.17.21",
"node-fetch": "~2.6.1",
"pa11y": "~6.1.0",
"pa11y": "^6.2.3",
"protocolify": "~3.0.0",
"puppeteer": "~9.1.1",
"wordwrap": "~1.0.0"

View file

@ -1,5 +1,5 @@
{
"devDependencies": {
"pa11y-ci": "3.0.1"
"pa11y-ci": "3.1.0"
}
}

1528
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[tool.poetry]
name = "jrnl"
version = "v4.1"
version = "v4.2.1"
description = "Collect your thoughts and notes without leaving the command line."
authors = [
"jrnl contributors <maintainers@jrnl.sh>",
@ -27,7 +27,7 @@ classifiers = [
"Funding" = "https://opencollective.com/jrnl"
[tool.poetry.dependencies]
python = ">=3.10.0, <3.13"
python = ">=3.10.0, <3.14"
colorama = ">=0.4" # https://github.com/tartley/colorama/blob/master/CHANGELOG.rst
cryptography = ">=3.0" # https://cryptography.io/en/latest/api-stability.html
@ -36,19 +36,19 @@ parsedatetime = ">=2.6"
python-dateutil = "^2.8" # https://github.com/dateutil/dateutil/blob/master/RELEASING
pyxdg = ">=0.27.0"
"ruamel.yaml" = ">=0.17.22"
rich = ">=12.2.0, <14.0.0"
rich = ">=14.0.0, <14.1.0"
# dayone-only deps
tzlocal = ">=4.0" # https://github.com/regebro/tzlocal/blob/master/CHANGES.txt
[tool.poetry.dev-dependencies]
[tool.poetry.group.dev.dependencies]
black = { version = ">=21.5b2", allow-prereleases = true }
ipdb = "*"
mkdocs = ">=1.4"
parse-type = ">=0.6.0"
poethepoet = "*"
pytest = ">=6.2"
pytest-bdd = ">=6.0"
pytest = ">=8.1"
pytest-bdd = ">=8.0"
pytest-clarity = "*"
pytest-xdist = ">=2.5.0"
requests = "*"
@ -91,7 +91,7 @@ lint.sequence = [
"poetry --version",
"poetry check",
"ruff --version",
"ruff .",
"ruff check .",
"black --version",
"black --check ."
]
@ -130,7 +130,7 @@ line-length = 88
target-version = "py310"
# https://beta.ruff.rs/docs/rules/
select = [
lint.select = [
'F', # Pyflakes
'E', # pycodestyle errors
'W', # pycodestyle warnings
@ -149,11 +149,11 @@ select = [
]
exclude = [".git", ".tox", ".venv", "node_modules"]
[tool.ruff.isort]
[tool.ruff.lint.isort]
force-single-line = true
known-first-party = ["jrnl", "tests"]
[tool.ruff.per-file-ignores]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"] # unused imports
[build-system]
@ -169,8 +169,8 @@ isolated_build = True
[testenv]
deps =
pytest >= 6.2
pytest-bdd >=6.0
pytest >=8.1
pytest-bdd >=8.0
pytest-xdist >=2.5.0
parse-type >=0.6.0
toml >=0.10

View file

@ -41,7 +41,14 @@ def generate_pa11y_config_from_sitemap():
urls += [url["loc"] for url in xml_sitemap["urlset"]["url"]]
with open(CONFIG_FILENAME, "w") as f:
f.write(json.dumps({"urls": urls}))
f.write(
json.dumps(
{
"defaults": {"chromeLaunchConfig": {"args": ["--no-sandbox"]}},
"urls": urls,
}
)
)
def output_file(file):

View file

@ -8,16 +8,20 @@ Feature: Test combinations of edit, change-time, and delete
And we write nothing to the editor if opened
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' --edit" and enter
"""
Y
N
Y
"""
Then the error output should contain "No text received from editor. Were you trying to delete all the entries?"
And the editor should have been called
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.
2022-04-23 10:30 Entry the first.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -29,12 +33,16 @@ Feature: Test combinations of edit, change-time, and delete
Scenario Outline: --delete with --edit deletes selected entries
Given we use the config "<config_file>"
And we append to the editor if opened
"""
[2023-02-21 10:32] Here is a new entry
"""
And we use the password "test" if prompted
When we run "jrnl --delete --edit" and enter
"""
Y
N
Y
"""
Then the editor should have been called
And the error output should contain "3 entries found"
And the error output should contain "2 entries deleted"
@ -42,8 +50,10 @@ Feature: Test combinations of edit, change-time, and delete
When we run "jrnl -99 --short"
Then the error output should contain "2 entries found"
And the output should be
"""
2020-08-31 14:32 A second entry in what I hope to be a long series.
2023-02-21 10:32 Here is a new entry
"""
Examples: Configs
| config_file |
@ -57,19 +67,23 @@ Feature: Test combinations of edit, change-time, and delete
And we use the password "test" if prompted
# --change-time is asked first, then --delete
When we run "jrnl --change-time '2022-04-23 10:30' --delete" and enter
"""
N
N
Y
Y
N
N
"""
Then the error output should contain "3 entries found"
And the error output should contain "1 entry deleted"
And the error output should contain "1 entry modified"
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.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -81,24 +95,30 @@ Feature: Test combinations of edit, change-time, and delete
Scenario Outline: Combining --change-time and --delete and --edit affects appropriate entries
Given we use the config "<config_file>"
And we append to the editor if opened
[2023-02-21 10:32] Here is a new entry
"""
[2023-02-21 10:32] Here is a new entry
"""
And we use the password "test" if prompted
# --change-time is asked first, then --delete, then --edit
When we run "jrnl --change-time '2022-04-23 10:30' --delete --edit" and enter
"""
N
Y
Y
Y
Y
N
"""
Then the error output should contain "3 entries found"
And the error output should contain "2 entries deleted"
And the error output should contain "1 entry modified" # only 1, because the other was deleted
And the error output should contain "1 entry added" # by edit
And the error output should contain "1 entry modified"
And the error output should contain "1 entry added"
When we run "jrnl -99 --short"
Then the output should be
"""
2022-04-23 10:30 The third entry finally after weeks without writing.
2023-02-21 10:32 Here is a new entry
"""
Examples: Configs
| config_file |

View file

@ -8,14 +8,18 @@ Feature: Change entry times in journal
When we run "jrnl -1"
Then the output should contain "2020-09-24 09:14 The third entry finally"
When we run "jrnl -1 --change-time '2022-04-23 10:30'" and enter
"""
Y
"""
Then the error output should contain "1 entry modified"
And the error output should not contain "deleted"
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.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -29,20 +33,26 @@ Feature: Change entry times in journal
And we use the password "test" if prompted
When we run "jrnl --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.
"""
When we run "jrnl --change-time '2022-04-23 10:30'" and enter
"""
Y
N
Y
"""
Then the error output should contain "3 entries found"
And the error output should contain "2 entries modified"
When we run "jrnl --short"
Then the output should be
"""
2020-08-31 14:32 A second entry in what I hope to be a long series.
2022-04-23 10:30 Entry the first.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -58,14 +68,18 @@ Feature: Change entry times in journal
When we run "jrnl -1"
Then the output should contain "2020-09-24 09:14 The third entry finally"
When we run "jrnl -1 --change-time '2023-02-21 10:30'" and enter
"""
N
"""
Then the error output should not contain "modified"
And the error output should not contain "deleted"
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_file |
@ -83,9 +97,11 @@ Feature: Change entry times in journal
And the error output should not contain "entries deleted"
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_file |
@ -99,14 +115,18 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' @ipsum" and enter
"""
Y
"""
Then the error output should contain "1 entry found"
And the error output should contain "1 entry modified"
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.
2022-04-23 10:30 Entry the first.
"""
Examples: Configs
| config_file |
@ -120,13 +140,17 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' @ipsum @tagthree" and enter
"""
Y
Y
"""
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.
2022-04-23 10:30 Entry the first.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -140,12 +164,16 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' -and @tagone @tagtwo" and enter
"""
Y
"""
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.
2022-04-23 10:30 Entry the first.
"""
Examples: Configs
| config_file |
@ -159,12 +187,16 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' @tagone -not @ipsum" and enter
"""
Y
"""
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.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -178,12 +210,16 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' -from 2020-09-01" and enter
"""
Y
"""
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.
2022-04-23 10:30 The third entry finally after weeks without writing.
"""
Examples: Configs
| config_file |
@ -197,13 +233,17 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' -to 2020-08-31" and enter
"""
Y
Y
"""
When we run "jrnl -99 --short"
Then the output should be
"""
2020-09-24 09:14 The third entry finally after weeks without writing.
2022-04-23 10:30 Entry the first.
2022-04-23 10:30 A second entry in what I hope to be a long series.
"""
Examples: Configs
| config_file |
@ -217,12 +257,16 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' -starred" and enter
"""
Y
"""
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.
2022-04-23 10:30 A second entry in what I hope to be a long series.
"""
Examples: Configs
| config_file |
@ -236,13 +280,17 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' -contains dignissim" and enter
"""
Y
"""
Then the error output should contain "1 entry modified"
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.
2022-04-23 10:30 Entry the first.
"""
Examples: Configs
| config_file |
@ -256,14 +304,18 @@ Feature: Change entry times in journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --change-time" and enter
"""
N
N
N
"""
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_file |

View file

@ -7,8 +7,8 @@ Feature: Multiple journals
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
Then the output should not contain "My first entry"
And the output should contain "Lorem ipsum"
Scenario: Write to default journal by default using an alternate config
Given the config "multiple.yaml" exists
@ -73,18 +73,22 @@ Feature: Multiple journals
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 the output should contain "Journal 'new_encrypted' created at "
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 the output should contain "Journal encrypted to features/journals/basic_onefile.journal"
And the config should contain "encrypt: false"
@ -122,7 +126,7 @@ Feature: Multiple journals
And we use the config "duplicate_keys.yaml"
When we run "jrnl -1"
Then the output should contain "There is at least one duplicate key in your configuration file"
Scenario: Show a warning message when using --config-file with duplicate keys
Given the config "duplicate_keys.yaml" exists
And we use the config "multiple.yaml"
@ -138,4 +142,4 @@ Feature: Multiple journals
Given we use the config "format_md.yaml"
When we run "jrnl -1"
Then the output should contain "Configuration updated to newest version at"
And the version in the config file should be up-to-date
And the version in the config file should be up-to-date

View file

@ -27,11 +27,13 @@ Feature: Reading and writing to journal with custom date formats
Then we should get no error
When we run "jrnl -n 999"
Then 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
@ -142,9 +144,11 @@ Feature: Reading and writing to journal with custom date formats
Given we use the config "mostlyreadabledates.yaml"
When we run "jrnl --short"
Then the output should be
"""
2019-07-01 14:23 The third entry
2019-07-18 14:23 The first entry
2019-07-19 14:23 The second entry
"""
Scenario: Update near-valid dates after journal is edited
@ -175,7 +179,9 @@ Feature: Reading and writing to journal with custom date formats
When we run "jrnl -1"
Then we should get no error
And the output should be
"""
2013-10-27 04:27 Some text.
"""
@skip #1422

View file

@ -8,15 +8,19 @@ Feature: Delete entries from journal
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 the error output should contain "3 entries found"
And the error output should contain "1 entry deleted"
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_file |
@ -29,13 +33,17 @@ Feature: Delete entries from journal
Scenario Outline: Backing out of interactive delete does not change journal
Given we use the config "<config_file>"
When we run "jrnl --delete -n 1" and enter
"""
N
"""
Then the error output should not contain "deleted"
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_file |
@ -50,9 +58,11 @@ Feature: Delete entries from journal
Then the error output should contain "No entries to delete"
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_file |
@ -64,13 +74,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with tag only deletes tagged entries
Given we use the config "<config_file>"
When we run "jrnl --delete @ipsum" and enter
"""
Y
"""
Then the error output should contain "1 entry found"
Then the error output should contain "1 entry deleted"
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_file |
@ -82,13 +96,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with multiple tags deletes all entries matching any of the tags
Given we use the config "<config_file>"
When we run "jrnl --delete @ipsum @tagthree" and enter
"""
Y
Y
"""
Then the error output should contain "2 entries found"
And the error output should contain "2 entries deleted"
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_file |
@ -100,13 +118,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with -and deletes boolean AND of tagged entries
Given we use the config "<config_file>"
When we run "jrnl --delete -and @tagone @tagtwo" and enter
"""
Y
"""
Then the error output should contain "1 entry found"
And the error output should contain "1 entry deleted"
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_file |
@ -118,13 +140,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with -not does not delete entries from given tag
Given we use the config "<config_file>"
When we run "jrnl --delete @tagone -not @ipsum" and enter
"""
Y
"""
Then the error output should contain "1 entry found"
And the error output should contain "1 entry deleted"
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_file |
@ -136,13 +162,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with -from search operator only deletes entries since that date
Given we use the config "<config_file>"
When we run "jrnl --delete -from 2020-09-01" and enter
"""
Y
"""
Then the error output should contain "1 entry found"
And the error output should contain "1 entry deleted"
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_file |
@ -154,13 +184,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with -to only deletes entries up to specified date
Given we use the config "<config_file>"
When we run "jrnl --delete -to 2020-08-31" and enter
"""
Y
Y
"""
Then the error output should contain "2 entries found"
And the error output should contain "2 entries deleted"
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_file |
@ -172,12 +206,16 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with -starred only deletes starred entries
Given we use the config "<config_file>"
When we run "jrnl --delete -starred" and enter
"""
Y
"""
Then the error output should contain "1 entry deleted"
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_file |
@ -189,13 +227,17 @@ Feature: Delete entries from journal
Scenario Outline: Delete flag with -contains only entries containing expression
Given we use the config "<config_file>"
When we run "jrnl --delete -contains dignissim" and enter
"""
Y
"""
Then the error output should contain "1 entry found"
And the error output should contain "1 entry deleted"
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_file |

View file

@ -11,8 +11,10 @@ Feature: Encrypting and decrypting journals
And the config for journal "default" should contain "encrypt: false"
When we run "jrnl -99 --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
@todo
@ -23,8 +25,10 @@ Feature: Encrypting and decrypting journals
Then the config for journal "default" should contain "encrypt: false"
When we run "jrnl -99 --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
Scenario: Trying to encrypt an already encrypted journal
@ -36,9 +40,11 @@ Feature: Encrypting and decrypting journals
Scenario Outline: Encrypting a journal
Given we use the config "simple.yaml"
When we run "jrnl --encrypt" and enter
"""
swordfish
swordfish
n
"""
Then we should get no error
And the output should contain "Journal encrypted"
And the config for journal "default" should contain "encrypt: true"
@ -50,16 +56,20 @@ Feature: Encrypting and decrypting journals
Given we use the config "simple.yaml"
And we don't have a keyring
When we run "jrnl --encrypt" and enter
"""
swordfish
swordfish
y
"""
Then we should get no error
And the output should contain "Journal encrypted"
When we run "jrnl --encrypt" and enter
"""
swordfish
tuna
tuna
y
"""
Then we should get no error
And the output should contain "Journal default is already encrypted. Create a new password."
And we should be prompted for a password
@ -69,15 +79,19 @@ Feature: Encrypting and decrypting journals
Given we use the config "simple.yaml"
And we have a keyring
When we run "jrnl --encrypt" and enter
"""
swordfish
swordfish
y
"""
Then we should get no error
And the output should contain "Journal encrypted"
When we run "jrnl --encrypt" and enter
"""
tuna
tuna
y
"""
Then we should get no error
And the output should contain "Journal default is already encrypted. Create a new password."
And we should be prompted for a password

View file

@ -8,7 +8,9 @@ Feature: Journals iteracting with the file system in a way that users can see
When we run "jrnl 23 July 2013: Testing folder journal."
Then we should get no error
And the journal directory should contain
"""
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"
@ -16,7 +18,9 @@ Feature: Journals iteracting with the file system in a way that users can see
And we run "jrnl 3/7/2014: Second entry of journal."
Then we should get no error
And the journal directory should contain
"""
2013/07/23.txt
"""
Scenario: If the journal and its parent directory don't exist, they should be created
Given we use the config "missing_directory.yaml"
@ -33,7 +37,7 @@ Feature: Journals iteracting with the file system in a way that users can see
Then the journal should exist
When we run "jrnl -99 --short"
Then the output should contain "This is a new entry in my journal"
@on_posix
Scenario: If the directory for a Folder journal ending in a slash ('/') doesn't exist, then it should be created
Given we use the config "missing_directory.yaml"
@ -55,9 +59,11 @@ Feature: Journals iteracting with the file system in a way that users can see
Scenario: Creating journal with relative path should update to absolute path
Given we use no config
When we run "jrnl hello world" and enter
"""
test.txt
n
\n
"""
Then the output should contain "Journal 'default' created"
When we change directory to "subfolder"
And we run "jrnl -n 1"

View file

@ -40,10 +40,12 @@ Feature: Custom formats
Given we parse the output as JSON
Then "entries" in the parsed output should have 3 elements
And "tags" in the parsed output should be
"""
@ipsum
@tagone
@tagtwo
@tagthree
"""
And "entries.0.tags" in the parsed output should have 3 elements
And "entries.1.tags" in the parsed output should have 1 elements
And "entries.2.tags" in the parsed output should have 2 elements
@ -62,7 +64,9 @@ Feature: Custom formats
And the output should be valid JSON
Given we parse the output as JSON
Then "entries.0.uuid" in the parsed output should be
"""
4BB1F46946AD439996C9B59DE7C4DDC1
"""
Scenario Outline: Printing a journal that has multiline entries with tags
Given we use the config "<config_file>"
@ -70,6 +74,7 @@ Feature: Custom formats
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
@ -90,6 +95,7 @@ Feature: Custom formats
| 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_file |
@ -108,9 +114,11 @@ Feature: Custom formats
Given we parse the output as JSON
Then "entries" in the parsed output should have 2 elements
And "tags" in the parsed output should be
"""
@ipsum
@tagone
@tagtwo
"""
And "entries.0.tags" in the parsed output should have 3 elements
And "entries.1.tags" in the parsed output should have 1 elements
@ -125,6 +133,7 @@ Feature: Custom formats
Given we use the config "<config_file>"
And we use the password "test" if prompted
Given we append to the editor if opened
"""
[2021-10-14 13:23] Heading Test
H1-1
@ -167,10 +176,12 @@ Feature: Custom formats
More stuff
more stuff again
"""
When we run "jrnl --edit -1"
Then the editor should have been called
When we run "jrnl -1 --export markdown"
Then the output should be
"""
# 2021
## October
@ -211,6 +222,7 @@ Feature: Custom formats
More stuff
more stuff again
"""
Examples: configs
| config_file |
@ -227,10 +239,12 @@ Feature: Custom formats
Then the output should be a valid XML string
And "entries" 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
@ -248,9 +262,11 @@ Feature: Custom formats
Given we parse the output as XML
Then "entries" in the parsed output should have 2 elements
And "tags" in the parsed output should be
"""
@idea
@journal
@dan
"""
And there should be 7 "tag" elements
Scenario Outline: Exporting tags
@ -258,10 +274,12 @@ Feature: Custom formats
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_file |
@ -293,6 +311,7 @@ Feature: Custom formats
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.
@ -375,6 +394,7 @@ Feature: Custom formats
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone
"""
Examples: configs
| config_file |
@ -390,11 +410,14 @@ Feature: Custom formats
And we create a cache directory
When we run "jrnl --format yaml --file {cache_dir}"
Then the cache directory 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
@ -420,7 +443,8 @@ Feature: Custom formats
porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos.
...
"""
Examples: configs
| config_file |
| basic_onefile.yaml |
@ -451,10 +475,13 @@ Feature: Custom formats
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
@ -472,6 +499,7 @@ Feature: Custom formats
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone
...
"""
Examples: configs
| config_file |
@ -516,6 +544,7 @@ Feature: Custom formats
Given we use the config "format_md.yaml"
When we run "jrnl -n 1"
Then the output should be
"""
# 2013
## June
@ -523,13 +552,16 @@ Feature: Custom formats
### 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 "<config_file>"
@ -538,7 +570,9 @@ Feature: Custom formats
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_file |
@ -553,9 +587,11 @@ Feature: Custom formats
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_file |
@ -571,7 +607,7 @@ Feature: Custom formats
When we run "jrnl --config-override display_format short -1"
Then we should get no error
When we run "jrnl --config-override display_format pretty -1"
Then we should get no error
Then we should get no error
Examples: configs
| config_file |
@ -588,7 +624,7 @@ Feature: Custom formats
When we run "jrnl --format markdown --file {cache_dir}"
Then the cache directory should contain 5 files
And we should get no error
Scenario: Export entries in text format with a title longer than max file name length.
Given we use the config "basic_onefile.yaml"
And we create a cache directory
@ -602,30 +638,42 @@ Feature: Custom formats
Given we use the config "basic_onefile.yaml"
When we run "jrnl --list"
Then the output should match
"""
Journals defined in config \(.+basic_onefile\.yaml\)
\* default -> features/journals/basic_onefile\.journal
"""
When we run "jrnl --list --format json"
Then the output should match
"""
{"config_path": ".+basic_onefile\.yaml", "journals": {"default": "features/journals/basic_onefile\.journal"}}
"""
When we run "jrnl --list --format yaml"
Then the output should match
"""
config_path: .+basic_onefile\.yaml
journals:
default: features/journals/basic_onefile\.journal
"""
Scenario: Export journal list to formats with no default journal
Given we use the config "no_default_journal.yaml"
When we run "jrnl --list"
Then the output should match
"""
Journals defined in config \(.+no_default_journal\.yaml\)
\* simple -> features/journals/simple\.journal
\* work -> features/journals/work\.journal
"""
When we run "jrnl --list --format json"
Then the output should match
"""
{"config_path": ".+no_default_journal\.yaml", "journals": {"simple": "features/journals/simple\.journal", "work": "features/journals/work\.journal"}}
"""
When we run "jrnl --list --format yaml"
Then the output should match
"""
config_path: .+no_default_journal\.yaml
journals:
simple: features/journals/simple\.journal
work: features/journals/work\.journal
"""

View file

@ -21,6 +21,7 @@ Feature: Importing data
Given we use the config "<config_file>"
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
@ -28,6 +29,7 @@ Feature: Importing data
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.
"""
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"
@ -44,11 +46,13 @@ Feature: Importing data
Given we use the config "<config_file>"
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.
"""
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"
@ -83,7 +87,9 @@ Feature: Importing data
But the output should not contain "I have an @idea"
And the output 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!
"""
And we run "jrnl -99"
Then the output should contain "My first entry."
And the output should contain "PROFIT!"

View file

@ -3,9 +3,11 @@ Feature: Installing jrnl
Scenario: Install jrnl with default options
Given we use no config
When we run "jrnl hello world" and enter
"""
\n
\n
\n
"""
Then the output should contain "jrnl configuration created at"
And the output should contain "For advanced features, read the docs at https://jrnl.sh"
And the output should contain "Journal 'default' created"
@ -16,9 +18,11 @@ Feature: Installing jrnl
Scenario: Install jrnl with custom relative default journal path
Given we use no config
When we run "jrnl hello world" and enter
"""
default/custom.txt
n
\n
"""
Then the output should contain "Journal 'default' created"
And the default journal "custom.txt" should be in the "default" directory
And the config should contain "encrypt: false"
@ -28,9 +32,11 @@ Feature: Installing jrnl
Given we use no config
And the home directory is called "home"
When we run "jrnl hello world" and enter
"""
~/custom.txt
n
\n
"""
Then the output should contain "Journal 'default' created"
And the default journal "custom.txt" should be in the "home" directory
And the config should contain "encrypt: false"
@ -39,9 +45,11 @@ Feature: Installing jrnl
Scenario: Install jrnl with encrypted default journal
Given we use no config
When we run "jrnl hello world" and enter
"""
encrypted.txt
y
\n
"""
Then the output should contain "Journal will be encrypted"
And the default journal "encrypted.txt" should be in the "." directory
And the config should contain "encrypt: true"
@ -52,46 +60,58 @@ Feature: Installing jrnl
Scenario: Install jrnl with colors by default
Given we use no config
When we run "jrnl hello world" and enter
"""
\n
\n
\n
"""
Then the output should contain "Journal 'default' created"
And the config should contain
"""
colors:
body: none
date: black
tags: yellow
title: cyan
"""
Scenario: Install jrnl without colors
Given we use no config
When we run "jrnl hello world" and enter
"""
\n
\n
N
"""
Then the output should contain "Journal 'default' created"
And the config should contain
"""
colors:
body: none
date: none
tags: none
title: none
"""
Scenario: Install jrnl with encrypted default journal with no entries
Given we use no config
When we run "jrnl -1" and enter
"""
encrypted.txt
y
n
test
test
n
"""
Then the error output should contain "Journal will be encrypted"
And the default journal "encrypted.txt" should be in the "." directory
And the config should contain "encrypt: true"
And the version in the config file should be up-to-date
When we run "jrnl -1" and enter
test
"""
test
"""
Then we should be prompted for a password
And the error output should contain "no entries found"
And the error output should not contain "Wrong password, try again"

View file

@ -7,8 +7,10 @@ Feature: Multiple journals
Given we use the config "multiple.yaml"
When we run "jrnl -99 --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
When we run "jrnl work -99 --short"
Then the output should be empty
@ -17,10 +19,14 @@ Feature: Multiple journals
When we run "jrnl this goes to default"
When we run "jrnl -99 --short"
Then the output should contain
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
Then the output should contain
"""
this goes to default
"""
When we run "jrnl work -99 --short"
Then the output should be empty
@ -29,8 +35,10 @@ Feature: Multiple journals
When we run "jrnl work a long day in the office"
When we run "jrnl -99 --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
When we run "jrnl work -99 --short"
Then the output should contain "a long day in the office"
@ -44,32 +52,44 @@ Feature: Multiple journals
When we run "jrnl work 23 july 2012: a long day in the office"
When we run "jrnl -99 --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
When we run "jrnl work -99 --short"
Then the output should be
"""
2012-07-23 09:00 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 the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
When we run "jrnl work -99 --short"
Then the output should be 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"
When we run "jrnl -99 --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
When we run "jrnl work -99 --short"
Then the output should contain
"""
a long day in the office
"""
Scenario: Create new journals as required
Given we use the config "multiple.yaml"
@ -77,7 +97,9 @@ Feature: Multiple journals
When we run "jrnl ideas 23 july 2012: sell my junk on ebay and make lots of money"
When we run "jrnl ideas -99 --short"
Then the output should be
"""
2012-07-23 09:00 sell my junk on ebay and make lots of money
"""
Scenario: Don't crash if no default journal is specified
Given we use the config "no_default_journal.yaml"
@ -87,9 +109,11 @@ Feature: Multiple journals
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 the output should contain "Journal 'new_encrypted' created at"
Scenario: Read and write to journal with emoji name

View file

@ -7,7 +7,9 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
Given we use the config "basic_encrypted.yaml"
And we use the password "test" if prompted
When we run "jrnl --config-override editor ''" and type
This is a journal entry
"""
This is a journal entry
"""
Then the stdin prompt should have been called
And the editor should not have been called
When we run "jrnl -1"
@ -27,6 +29,7 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
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.
@ -40,6 +43,7 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
But I'm better.
"""
Scenario: Override color selections with runtime overrides
@ -59,12 +63,14 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
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 in memory should contain
"""
editor: nano
colors:
title: none
body: green
tags: none
date: none
"""
Scenario: Override default journal
@ -74,6 +80,7 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
Then we should get no error
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.
@ -81,6 +88,7 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
2013-06-10 15:40 Life is good.
| But I'm better.
"""
Scenario: Make an entry into an overridden journal
@ -91,6 +99,7 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
And the output should contain "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.
@ -98,3 +107,4 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
2013-06-10 15:40 Life is good.
| But I'm better.
"""

View file

@ -7,9 +7,11 @@ Feature: Using the installed 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 contain "encrypt: true"
When we run "jrnl simple -n 1"
Then the output should contain "2013-06-10 15:40 Life is good"
@ -19,9 +21,11 @@ Feature: Using the installed keyring
Given we use the config "simple.yaml"
When we run "jrnl test entry"
And we run "jrnl --encrypt" and enter
"""
password
password
n
"""
Then we should get no error
And the output should not contain "Failed to retrieve keyring"
@ -30,9 +34,11 @@ Feature: Using the installed keyring
Given we use the config "simple.yaml"
When we run "jrnl test entry"
And we run "jrnl --encrypt" and enter
"""
password
password
y
"""
Then we should get no error
And the output should not contain "Failed to retrieve keyring"
# @todo add step to check contents of keyring
@ -55,9 +61,11 @@ Feature: Using the installed keyring
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 the output should contain "Failed to retrieve keyring"
And we should get no error
And we should be prompted for a password
@ -77,8 +85,10 @@ Feature: Using the installed keyring
When we run "jrnl --short"
Then we should not be prompted for a password
And the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
Scenario: Open encrypted journal when keyring exists but fails
@ -96,25 +106,31 @@ Feature: Using the installed keyring
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 the output should contain "Passwords did not match"
And the config for journal "default" should not contain "encrypt: true"
When we run "jrnl --short"
Then the output should be
"""
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
"""
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 the output should contain "Passwords did not match"
And the output should contain "Journal encrypted"

View file

@ -27,7 +27,7 @@ Feature: Searching in a journal
When we run "jrnl tomorrow: A future entry."
Then we should get no error
When we run "jrnl -from today"
Then the output should contain "2 entries found"
Then the output should contain "2 entries found"
And 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"
@ -65,7 +65,9 @@ Feature: Searching in a journal
Then we should get no error
And the output should contain "1 entry found"
And the output should be
"""
2020-08-29 11:11 Entry the first.
"""
Examples: configs
| config_file |
@ -86,6 +88,40 @@ Feature: Searching in a journal
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Multiple -contains returns entries that match any
Given we use the config "<config_file>"
When we run "jrnl -contains emojis -contains lorem --short"
Then we should get no error
And the output should contain "3 entries found"
And 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_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Multiple -contains with -and returns only entries that match all
Given we use the config "<config_file>"
When we run "jrnl -contains emojis -contains nulla -and --short"
Then we should get no error
And the output should contain "1 entry found"
And the output should be
"""
2020-09-24 09:14 The third entry finally after weeks without writing.
"""
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching for a string within tag results
Given we use the config "<config_file>"
When we run "jrnl @tagone -contains maybe"
@ -189,19 +225,23 @@ Feature: Searching in a journal
Then we should get no error
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 "<config_file>"
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_file |
@ -214,8 +254,10 @@ Feature: Searching in a journal
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_file |
@ -227,8 +269,10 @@ Feature: Searching in a journal
Given we use the config "<config_file>"
When we run "jrnl --tags -not @tagtwo"
Then the output should be
"""
@tagthree : 1
@tagone : 1
"""
Examples: configs
| config_file |
@ -240,7 +284,9 @@ Feature: Searching in a journal
Given we use the config "<config_file>"
When we run "jrnl --tags -not @tagone -not @tagthree"
Then the output should be
"""
@tagtwo : 1
"""
Examples: configs
| config_file |
@ -272,11 +318,13 @@ Feature: Searching in a journal
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 "<config_file>"
@ -351,8 +399,10 @@ Feature: Searching in a journal
And we run "jrnl -today-in-history --short"
Then the output should contain "2 entries found"
And 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_file |
@ -367,11 +417,13 @@ Feature: Searching in a journal
Then we should get no error
And the output should contain "3 entries found"
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!
"""
Scenario Outline: Searching the most recent entry should not show found count
Given we use the config "<config_file>"

View file

@ -11,9 +11,11 @@ Feature: Tagging
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_file |
@ -41,8 +43,10 @@ Feature: Tagging
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_file |

View file

@ -2,12 +2,13 @@
# License: https://www.gnu.org/licenses/gpl-3.0.html
Feature: Using templates
Scenario Outline: Template contents should be used in new entry
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we append to the editor if opened
"""
This is an addition to a templated entry
"""
When we run "jrnl --config-override template features/templates/basic.template"
And we run "jrnl -1"
Then the output should contain "This text is in the basic template"

View file

@ -8,19 +8,27 @@ Feature: Upgrading Journals from 1.x.x to 2.x.x
When we run "jrnl -9" and enter "Y"
When we run "jrnl -99 --short"
Then the output should be
"""
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
"""
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"
@ -28,18 +36,22 @@ Feature: Upgrading Journals from 1.x.x to 2.x.x
Given we use the config "no_colors.yaml"
When we run "jrnl -n 1"
Then the config should contain
"""
colors:
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 --short" and enter "Y"
Then the output should contain
"""
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".
"""
Scenario: Upgrade with missing journal
Given we use the config "upgrade_from_195_with_missing_journal.json"
@ -50,8 +62,10 @@ Feature: Upgrading Journals from 1.x.x to 2.x.x
Scenario: Upgrade with missing encrypted journal
Given we use the config "upgrade_from_195_with_missing_encrypted_journal.json"
When we run "jrnl --list" and enter
"""
Y
bad doggie no biscuit
"""
Then the output should contain "features/journals/missing.journal does not exist"
And the output should contain "We're all done"
And we should get no error

View file

@ -67,7 +67,9 @@ Feature: Writing new entries.
Then we should get no error
Then the editor should have been called
And the editor file content should be
"""
this is a partial
"""
Examples: configs
| config_file |
@ -146,8 +148,10 @@ Feature: Writing new entries.
Then we should get no error
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 |
@ -206,13 +210,17 @@ Feature: Writing new entries.
Given we parse the output as JSON
Then "entries" in the parsed output should have 5 elements
And "entries.0.creator" in the parsed output should be
"""
software_agent
os_agent
host_name
generation_date
device_agent
"""
And "entries.0.creator.software_agent" in the parsed output should contain
"""
jrnl
"""
Scenario: Title with an embedded period on DayOne journal
Given we use the config "dayone.yaml"
@ -220,8 +228,10 @@ Feature: Writing new entries.
Then we should get no error
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 am 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"
@ -234,7 +244,9 @@ Feature: Writing new entries.
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we append to the editor if opened
"""
[2021-11-13] worked on jrnl tests
"""
When we run "jrnl --edit"
Then the error output should contain "3 entries found"
And the error output should contain "1 entry added"
@ -252,9 +264,11 @@ Feature: Writing new entries.
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we append to the editor if opened
"""
[2021-11-11] worked on jrnl tests
[2021-11-12] worked on jrnl tests again
[2021-11-13] worked on jrnl tests a little bit more
"""
When we run "jrnl --edit"
Then the error output should contain "3 entries found"
And the error output should contain "3 entries added"
@ -271,7 +285,9 @@ Feature: Writing new entries.
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we write to the editor if opened
"""
[2021-11-13] I am replacing my whole journal with this entry
"""
When we run "jrnl --edit"
Then the output should contain "2 entries deleted"
And the output should contain "1 entry modified"
@ -288,7 +304,9 @@ Feature: Writing new entries.
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we write to the editor if opened
"""
[2021-11-13] I am replacing the last entry with this entry
"""
When we run "jrnl --edit -1"
Then the error output should contain "1 entry modified"
@ -304,7 +322,9 @@ Feature: Writing new entries.
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we append to the editor if opened
"""
This is a small addendum to my latest entry.
"""
When we run "jrnl --edit"
Then the error output should contain "3 entries found"
And the error output should contain "1 entry modified"
@ -341,12 +361,16 @@ Feature: Writing new entries.
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we append to the editor if opened
"""
@newtag
"""
When we run "jrnl --edit -1"
Then the error output should contain "1 entry modified"
When we run "jrnl --tags @newtag"
Then the output should contain
"""
1 entry found
"""
Examples: configs
| config_file |

View file

@ -9,10 +9,11 @@ import string
from datetime import datetime
from unittest.mock import MagicMock
from unittest.mock import patch
from xml.etree import ElementTree
from xml.etree import ElementTree as ET
from pytest_bdd import given
from pytest_bdd.parsers import parse
from pytest_bdd.parsers import re
from jrnl import __version__
from jrnl.time import __get_pdt_calendar
@ -21,7 +22,11 @@ from tests.lib.fixtures import NoKeyring
from tests.lib.fixtures import TestKeyring
@given(parse("we {editor_method} to the editor if opened\n{editor_input}"))
@given(re(r"we (?P<editor_method>\w+) to the editor if opened"))
def we_enter_editor_docstring(editor_method, editor_state, docstring):
we_enter_editor(editor_method, docstring, editor_state)
@given(parse("we {editor_method} nothing to the editor if opened"))
def we_enter_editor(editor_method, editor_input, editor_state):
file_method = editor_state["intent"]["method"]
@ -168,7 +173,7 @@ def parse_output_as_language(cli_run, language_name):
actual_output = cli_run["stdout"]
if language_name == "XML":
parsed_output = ElementTree.fromstring(actual_output)
parsed_output = ET.fromstring(actual_output)
elif language_name == "JSON":
parsed_output = json.loads(actual_output)
else:

View file

@ -4,10 +4,11 @@
import json
import os
import re
from xml.etree import ElementTree
from xml.etree import ElementTree as ET
from pytest_bdd import then
from pytest_bdd.parsers import parse
from pytest_bdd.parsers import re as pytest_bdd_parsers_re
from ruamel.yaml import YAML
from jrnl.config import scope_config
@ -30,7 +31,11 @@ def should_get_an_error(cli_run):
assert cli_run["status"] != 0, cli_run["status"]
@then(parse("the output should match\n{regex}"))
@then(parse("the output should match"))
def output_should_match_docstring(cli_run, docstring):
output_should_match(docstring, cli_run)
@then(parse('the output should match "{regex}"'))
def output_should_match(regex, cli_run):
out = cli_run["stdout"]
@ -38,14 +43,18 @@ def output_should_match(regex, cli_run):
assert matches, f"\nRegex didn't match:\n{regex}\n{str(out)}\n{str(matches)}"
@then(parse("the output {it_should:Should} contain\n{expected}", SHOULD_DICT))
@then(parse('the output {it_should:Should} contain "{expected}"', SHOULD_DICT))
@then(parse("the output {it_should:Should} contain", SHOULD_DICT))
@then(
parse(
"the {which_output_stream} output {it_should:Should} contain\n{expected}",
"the {which_output_stream} output {it_should:Should} contain",
SHOULD_DICT,
)
)
def output_should_contain_docstring(which_output_stream, cli_run, it_should, docstring):
output_should_contain(docstring, which_output_stream, cli_run, it_should)
@then(parse('the output {it_should:Should} contain "{expected}"', SHOULD_DICT))
@then(
parse(
'the {which_output_stream} output {it_should:Should} contain "{expected}"',
@ -75,13 +84,21 @@ def output_should_contain(expected, which_output_stream, cli_run, it_should):
assert (expected in cli_run[which_output_stream]) == it_should, output_str
@then(parse("the output should not contain\n{expected_output}"))
@then(parse("the output should not contain"))
def output_should_not_contain_docstring(cli_run, docstring):
output_should_not_contain(docstring, cli_run)
@then(parse('the output should not contain "{expected_output}"'))
def output_should_not_contain(expected_output, cli_run):
assert expected_output not in cli_run["stdout"]
@then(parse("the output should be\n{expected_output}"))
@then(parse("the output should be"))
def output_should_be_docstring(cli_run, docstring):
output_should_be(docstring, cli_run)
@then(parse('the output should be "{expected_output}"'))
def output_should_be(expected_output, cli_run):
actual = cli_run["stdout"].strip()
@ -137,6 +154,17 @@ def default_journal_location(journal_file, journal_dir, config_on_disk, temp_dir
assert os.path.samefile(default_journal_path, expected_journal_path)
@then(
parse(
'the config for journal "{journal_name}" {it_should:Should} contain',
SHOULD_DICT,
)
)
@then(parse("the config {it_should:Should} contain", SHOULD_DICT))
def config_var_on_disk_docstring(config_on_disk, journal_name, it_should, docstring):
config_var_on_disk(config_on_disk, journal_name, it_should, docstring)
@then(
parse(
'the config for journal "{journal_name}" '
@ -144,15 +172,7 @@ def default_journal_location(journal_file, journal_dir, config_on_disk, temp_dir
SHOULD_DICT,
)
)
@then(
parse(
'the config for journal "{journal_name}" '
"{it_should:Should} contain\n{some_yaml}",
SHOULD_DICT,
)
)
@then(parse('the config {it_should:Should} contain "{some_yaml}"', SHOULD_DICT))
@then(parse("the config {it_should:Should} contain\n{some_yaml}", SHOULD_DICT))
def config_var_on_disk(config_on_disk, journal_name, it_should, some_yaml):
actual = config_on_disk
if journal_name:
@ -168,6 +188,20 @@ def config_var_on_disk(config_on_disk, journal_name, it_should, some_yaml):
assert (expected == actual_slice) == it_should
@then(
parse(
'the config in memory for journal "{journal_name}" '
"{it_should:Should} contain",
SHOULD_DICT,
)
)
@then(parse("the config in memory {it_should:Should} contain", SHOULD_DICT))
def config_var_in_memory_docstring(
config_in_memory, journal_name, it_should, docstring
):
config_var_in_memory(config_in_memory, journal_name, it_should, docstring)
@then(
parse(
'the config in memory for journal "{journal_name}" '
@ -175,19 +209,9 @@ def config_var_on_disk(config_on_disk, journal_name, it_should, some_yaml):
SHOULD_DICT,
)
)
@then(
parse(
'the config in memory for journal "{journal_name}" '
"{it_should:Should} contain\n{some_yaml}",
SHOULD_DICT,
)
)
@then(
parse('the config in memory {it_should:Should} contain "{some_yaml}"', SHOULD_DICT)
)
@then(
parse("the config in memory {it_should:Should} contain\n{some_yaml}", SHOULD_DICT)
)
def config_var_in_memory(config_in_memory, journal_name, it_should, some_yaml):
actual = config_in_memory["overrides"]
if journal_name:
@ -213,21 +237,23 @@ def password_was_not_called(cli_run):
assert not cli_run["mocks"]["user_input"].return_value.input.called
@then(parse("the cache directory should contain the files\n{file_list}"))
def assert_dir_contains_files(file_list, cache_dir):
assert does_directory_contain_files(file_list, cache_dir["path"])
@then(parse("the cache directory should contain the files"))
def assert_dir_contains_files(cache_dir, docstring):
assert does_directory_contain_files(docstring, cache_dir["path"])
@then(parse("the cache directory should contain {number} files"))
@then(
pytest_bdd_parsers_re(r"the cache directory should contain (?P<number>\d+) files")
)
def assert_dir_contains_n_files(cache_dir, number):
assert does_directory_contain_n_files(cache_dir["path"], number)
@then(parse("the journal directory should contain\n{file_list}"))
def journal_directory_should_contain(config_on_disk, file_list):
@then(parse("the journal directory should contain"))
def journal_directory_should_contain(config_on_disk, docstring):
scoped_config = scope_config(config_on_disk, "default")
assert does_directory_contain_files(file_list, scoped_config["journal"])
assert does_directory_contain_files(docstring, scoped_config["journal"])
@then(parse('journal "{journal_name}" should not exist'))
@ -262,10 +288,10 @@ def directory_should_not_exist(config_on_disk, it_should, journal_name):
assert dir_exists == it_should
@then(parse('the content of file "{file_path}" in the cache should be\n{file_content}'))
def content_of_file_should_be(file_path, file_content, cache_dir):
@then(parse('the content of file "{file_path}" in the cache should be'))
def content_of_file_should_be(file_path, cache_dir, docstring):
assert cache_dir["exists"]
expected_content = file_content.strip().splitlines()
expected_content = docstring.strip().splitlines()
with open(os.path.join(cache_dir["path"], file_path), "r") as f:
actual_content = f.read().strip().splitlines()
@ -282,12 +308,12 @@ def content_of_file_should_be(file_path, file_content, cache_dir):
]
@then(parse("the cache should contain the files\n{file_list}"))
def cache_dir_contains_files(file_list, cache_dir):
@then(parse("the cache should contain the files"))
def cache_dir_contains_files(cache_dir, docstring):
assert cache_dir["exists"]
actual_files = os.listdir(cache_dir["path"])
expected_files = file_list.split("\n")
expected_files = docstring.split("\n")
# sort to deal with inconsistent default file ordering on different OS's
actual_files.sort()
@ -300,7 +326,7 @@ def cache_dir_contains_files(file_list, cache_dir):
def assert_output_is_valid_language(cli_run, language_name):
language_name = language_name.upper()
if language_name == "XML":
xml_tree = ElementTree.fromstring(cli_run["stdout"])
xml_tree = ET.fromstring(cli_run["stdout"])
assert xml_tree, "Invalid XML"
elif language_name == "JSON":
assert json.loads(cli_run["stdout"]), "Invalid JSON"
@ -336,11 +362,11 @@ def assert_parsed_output_item_count(node_name, number, parsed_output):
assert False, f"Language name {lang} not recognized"
@then(parse('"{field_name}" in the parsed output should {comparison}\n{expected_keys}'))
def assert_output_field_content(field_name, comparison, expected_keys, parsed_output):
@then(parse('"{field_name}" in the parsed output should {comparison}'))
def assert_output_field_content(field_name, comparison, parsed_output, docstring):
lang = parsed_output["lang"]
obj = parsed_output["obj"]
expected_keys = expected_keys.split("\n")
expected_keys = docstring.split("\n")
if len(expected_keys) == 1:
expected_keys = expected_keys[0]
@ -390,7 +416,7 @@ def assert_output_field_content(field_name, comparison, expected_keys, parsed_ou
@then(parse('there should be {number:d} "{item}" elements'))
def count_elements(number, item, cli_run):
actual_output = cli_run["stdout"]
xml_tree = ElementTree.fromstring(actual_output)
xml_tree = ET.fromstring(actual_output)
assert len(xml_tree.findall(".//" + item)) == number
@ -420,9 +446,13 @@ def editor_filename_suffix(suffix, editor_state):
assert editor_state["tmpfile"]["name"].endswith(suffix), (editor_filename, suffix)
@then(parse("the editor file content should {comparison}"))
def contains_editor_file_docstring(comparison, editor_state, docstring):
contains_editor_file(comparison, docstring, editor_state)
@then(parse('the editor file content should {comparison} "{str_value}"'))
@then(parse("the editor file content should {comparison} empty"))
@then(parse("the editor file content should {comparison}\n{str_value}"))
def contains_editor_file(comparison, str_value, editor_state):
content = editor_state["tmpfile"]["content"]
# content = f'\n"""\n{content}\n"""\n'

View file

@ -7,7 +7,13 @@ from contextlib import ExitStack
from pytest_bdd import when
from pytest_bdd.parsers import parse
from pytest_bdd.parsers import re
from pytest_bdd.steps import inject_fixture
# This is an undocumented and unsupported function:
# https://github.com/pytest-dev/pytest-bdd/issues/684
try:
from pytest_bdd.compat import inject_fixture # pytest_bdd 7.1.2 and later
except ImportError:
from pytest_bdd.steps import inject_fixture # pytest_bdd 7.1.1 and earlier
from jrnl.main import run
@ -28,7 +34,11 @@ all_input = '("(?P<all_input>[^"]*)")'
# an empty line of input internally for testing purposes.
@when(parse('we run "jrnl {command}" and {input_method}\n{all_input}'))
@when(re(f'we run "jrnl {command}" and {input_method}'))
def we_run_jrnl_docstring(capsys, keyring, request, command, input_method, docstring):
we_run_jrnl(capsys, keyring, request, command, input_method, docstring)
@when(re(f'we run "jrnl ?{command}" and {input_method} {all_input}'))
@when(re(f'we run "jrnl {command}"(?! and)'))
@when('we run "jrnl"')

View file

@ -6,9 +6,6 @@ from unittest import mock
import pytest
from jrnl.exception import JrnlException
from jrnl.messages import Message
from jrnl.messages import MsgStyle
from jrnl.messages import MsgText
from jrnl.plugins.fancy_exporter import check_provided_linewrap_viability
from jrnl.plugins.yaml_exporter import YAMLExporter
@ -36,12 +33,8 @@ class TestFancy:
class TestYaml:
@mock.patch("jrnl.plugins.yaml_exporter.YAMLExporter.export_journal")
@mock.patch("builtins.open")
def test_export_to_nonexisting_folder(self, mock_open, mock_export_journal):
mock_export_journal.side_effect = JrnlException(
Message(MsgText.YamlMustBeDirectory, MsgStyle.ERROR)
)
def test_export_to_nonexisting_folder(self, mock_open):
with pytest.raises(JrnlException):
YAMLExporter.write_file("journal", "non-existing-path")
mock_open.assert_not_called()

View file

@ -55,7 +55,7 @@ def test_empty():
def test_contains_alone():
assert cli_as_dict("-contains whatever") == expected_args(contains="whatever")
assert cli_as_dict("-contains whatever") == expected_args(contains=["whatever"])
def test_debug_alone():
@ -296,7 +296,7 @@ class TestDeserialization:
)
def test_deserialize_multiword_strings(self, input_str):
runtime_config = make_yaml_valid_dict(input_str)
assert runtime_config.__class__ == dict
assert runtime_config.__class__ is dict
assert input_str[0] in runtime_config
assert runtime_config[input_str[0]] == input_str[1]