matplotlib / matplotlib/pytest-mpl

Roadmap for `v1.0.0`

Open
#198 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

question
Dominant language
Python
Stars
272
Forks
53
PR merge metrics
No merged PRs in 30d

Description

I reviewed all the configuration options which are used in the code and found quite a few inconsistencies. I have listed proposed fixes for them, separated into breaking and non-breaking changes. We can add warning for the breaking changes now, and then change in `v1.0.0`.

Let's discuss these lists. Are there any items which should be added or removed? For the breaking changes, how long of a warning period should we have? For any of them, should we only start warning in `v1.0.0` and then change in `v1.1.0`?

## Review of configuration options

| Option | kwarg | CLI | ini | *default* |
| ------ | ----- | --- | --- | ------- |
||||||
| Enable testing | N/A | `--mpl` | N/A | `False` |
| Enable baseline image generation, at specified directory path (relative to where pytest was run) | N/A | `--mpl-generate-path` | N/A | `None` |
| Enable baseline hash generation, at specified file path (relative to where pytest was run) | N/A | `--mpl-generate-hash-library` | N/A | `None` |
||||||
| Directory containing baseline images
(relative to the test file) | `baseline_dir` | `--mpl-baseline-path`
**(relative to where pytest was run)** | | `baseline/` |
| Whether `--mpl-baseline-path` should also be relative to the test file | N/A | `--mpl-baseline-relative` | N/A | `False` |
||||||
| Filename of the baseline image | `filename` | N/A | N/A | test name |
| Whether to include the module name in the baseline image filename | ? | | `mpl-use-full-test-name` | `False` |
||||||
| File containing baseline hashes
(relative to the test file) | `hash_library` | `--mpl-hash-library` | | no hash comparison |
||||||
| RMS tolerance | `tolerance` | | | `2` |
| Whether to standardise metadata | `deterministic` | | | `True` (PNG: `False`) |
| kwargs to pass to savefig | `savefig_kwargs` | N/A | N/A | `{}` |
| Matplotlib style | `style` | | | `classic` |
| Whether to remove axis tick labels | `remove_text` | | | `False` |
| Matplotlib backend | `backend` | | | `agg` |
||||||
| Directory to write testing artifacts to
(relative to where pytest was run) | N/A | `--mpl-results-path` | `mpl-results-path` | temp dir |
| Whether to save result images for passing tests | N/A | `--mpl-results-always` | `mpl-results-always` | `False` (`True` if generating a HTML summary) |
| Which test summaries to generate, if any | N/A | `--mpl-generate-summary={html,json,basic-html}` | | `None` |

### Notes
1. N/A are options which we don't think should exist.
1. Empty boxes are options which we do think should exist.
1. ? are options which could exist but would be of limited use.
1. Due to how paths are computed by Python, the baseline directory and hash library paths can be absolute. In this case `--mpl-baseline-relative` and what directory the paths are interpreted to be relative to does not have any effect.
1. Path specified in kwargs *should* be relative to the test file, and paths specified in CLI and ini options *should* be relative to where pytest was run.

## Non-breaking changes
- [x] Document that backend can be specified. #199
- [x] Document the option to use the full test name. #199
- [x] Document that `mpl-use-full-test-name` ini overrides the `filename` kwarg. #199
- [x] Add `mpl-baseline-path` ini option (relative to where pytest was run). #181
- [x] Expand `mpl-use-full-test-name` ini option to CLI (and maybe kwarg). #181
- [x] Add `mpl-hash-library` ini option (relative to where pytest was run). #181
- [x] Add `--mpl-default-tolerance` CLI and `mpl-default-tolerance` ini options. #181
- [x] Add CLI and ini options for `deterministic`. #197
- [x] Add `--mpl-default-style` CLI and `mpl-default-style` ini options. #181
- [ ] Add CLI and ini options for `remove_text`.
- [x] Add CLI and ini options for `backend`. #181
- [x] Add `generate-summary` ini option for generating test summaries. #181

## Breaking changes
- [ ] `--mpl-hash-library` should be relative to where pytest was run (to match `--mpl-baseline-path`).
- [ ] Local `hash_library` kwarg should take precedence over global `--mpl-hash-library` CLI option. #154
- [ ] Deprecate the use of multiple hash libraries in the same pytest run (not necessary because files are small and include the full module path anyway). #154
- [ ] Deprecate the use of multiple testing modes in the same pytest run (e.g. warn if one test only has hash comparison while the others only have image comparison)
- [ ] Use Matplotlib's default style instead of `'classic'`.
- [ ] Change the default RMS tolerance to `0`.
- [ ] Enable deterministic PNG files by default.
- [ ] Deprecate `remove_text` kwarg and replace with better named [`remove_ticks_and_titles`](https://github.com/matplotlib/pytest-mpl/blob/e6c1308c155e56d521fee2b2731b9e877417a8d7/pytest_mpl/plugin.py#L681)
- [ ] (???) Add a `remove_text` kwarg that actually removes *all* text.
- [ ] (???) Rename `baseline_dir`/`--mpl-baseline-path` to have consistent name.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reviewing the configuration options and the unresolved breaking and non-breaking changes listed in this issue, then inspect pytest_mpl/plugin.py at the referenced remove_text entry point. The issue needs maintainer decisions on scope, warning periods, and defaults before implementation can begin; done would require an agreed roadmap and corresponding changes.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing-qa
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.