Title: Check modification times of included RST files by yongrenjie · Pull Request #20374 · matplotlib/matplotlib · GitHub
Open Graph Title: Check modification times of included RST files by yongrenjie · Pull Request #20374 · matplotlib/matplotlib
X Title: Check modification times of included RST files by yongrenjie · Pull Request #20374 · matplotlib/matplotlib
Description: Fixes #17860. Briefly, to reproduce this bug: Create a file included.rst with a plot inside it. Create a file index.rst containing the include directive .. include:: included.rst. Build Sphinx documentation. Modify the plotting code inside included.rst, but don't touch index.rst. Rebuild the Sphinx documentation. Because index.rst wasn't touched, plot_directive thinks that it's up-to-date and thus the image doesn't need to be re-created. This commit fixes the issue by checking the modification times not only of the source file (index.rst in this case), but also of the file(s) included within it (included.rst). PR Summary The commit message contains most of the info, but I attach some extra detail here just in case people come across it and find it useful. There are a couple of ways to get the included files: Method 1 Since docutils 0.17, there is an attribute state.document.include_log which is a list of tuples containing the names of any files that were included, which is exactly what we want. [('index.rst', (None, None, None, None), 4.611686018427388e+18), ('included.rst', (None, None, None, None), 21)] Method 2 Directly inspect state_machine.input_lines.items, which is a list of tuples (source, offset). If a RST file is included, then we can get its filename (relative to the top-level Sphinx directory) in source. For example, this is what plot_directive can when I place .. include:: included.rst inside the file ~/test/plot_dir/index.rst: [('included.rst', 2), ('included.rst', 3), ('included.rst', 4), ('included.rst', 5), ('included.rst', 6), ('included.rst', 7), ('included.rst', 8), ('included.rst', 9), ('included.rst', 10), ('included.rst', 11), ('included.rst', 12), ('internal padding after included.rst', 13), ('/Users/yongrenjie/test/plot_dir/index.rst', 7), ('/Users/yongrenjie/test/plot_dir/index.rst', 8), ('/Users/yongrenjie/test/plot_dir/index.rst', 9), ('/Users/yongrenjie/test/plot_dir/index.rst', 10), ('/Users/yongrenjie/test/plot_dir/index.rst', 11), ('/Users/yongrenjie/test/plot_dir/index.rst', 12), ('/Users/yongrenjie/test/plot_dir/index.rst', 13), ('/Users/yongrenjie/test/plot_dir/index.rst', 14), ('/Users/yongrenjie/test/plot_dir/index.rst', 15), ('/Users/yongrenjie/test/plot_dir/index.rst', 16), ('/Users/yongrenjie/test/plot_dir/index.rst', 17), ('/Users/yongrenjie/test/plot_dir/index.rst', 18) ] The issue with this is that there's the 'internal padding after...' line which we would have to filter out, and I'm not sure what other directives (if any) might also add some junk to this list. I got around this by first removing duplicates and then checking which of the entries were valid files. I feel like Method 2 is a bit fragile, so I made it as a fallback: try: # method 1... except AttributeError: # indicates docutils <=0.16 # method 2... I've tested this all the way back to docutils 0.14 and it seems to be pretty reliable. PR Checklist N/A Has pytest style unit tests (and pytest passes). Is Flake 8 compliant (run flake8 on changed files to check). N/A New features are documented, with examples if plot related. N/A Documentation is sphinx and numpydoc compliant (the docs should build without error). Conforms to Matplotlib style conventions (install flake8-docstrings and run flake8 --docstring-convention=all). N/A New features have an entry in doc/users/next_whats_new/ (follow instructions in README.rst there). N/A API changes documented in doc/api/next_api_changes/ (follow instructions in README.rst there).
Open Graph Description: Fixes #17860. Briefly, to reproduce this bug: Create a file included.rst with a plot inside it. Create a file index.rst containing the include directive .. include:: included.rst. Build Sphin...
X Description: Fixes #17860. Briefly, to reproduce this bug: Create a file included.rst with a plot inside it. Create a file index.rst containing the include directive .. include:: included.rst. Build Sphin...
Opengraph URL: https://github.com/matplotlib/matplotlib/pull/20374
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/files(.:format) |
| route-controller | pull_requests |
| route-action | files |
| fetch-nonce | v2:003e2b6c-553f-c742-3dd3-ca1631ab9943 |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | DA2A:3E45D3:923B86:C44075:6A5563D9 |
| html-safe-nonce | cb5fcaba3a728513cf982c4a6fda31426006eac5cf6f6bde6698e4c225c1c8c7 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQTJBOjNFNDVEMzo5MjNCODY6QzQ0MDc1OjZBNTU2M0Q5IiwidmlzaXRvcl9pZCI6IjIyMjc5Nzc5Mjk2ODU4MjAzNzciLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | cbe9d18867d7e15080d815736283ef1e1ee85e90ce1f67384b11f0567a6570c0 |
| hovercard-subject-tag | pull_request:662690857 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/matplotlib/matplotlib/pull/20374/files |
| twitter:image | https://avatars.githubusercontent.com/u/22414895?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/22414895?s=400&v=4 |
| og:image:alt | Fixes #17860. Briefly, to reproduce this bug: Create a file included.rst with a plot inside it. Create a file index.rst containing the include directive .. include:: included.rst. Build Sphin... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | b5665c84831ed9ac4fb79519c16c9c5580ba8092fb8bb6e3e72972ec7197348e |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | true |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 8201d0b7bc32164c4662de52242e463a356df543 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width